31

我正在尝试调用基于类的视图并且我能够做到,但由于某种原因,我没有得到我正在调用的新类的上下文

class ShowAppsView(LoginRequiredMixin, CurrentUserIdMixin, TemplateView):
    template_name = "accounts/thing.html"



    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        return super(ShowAppsView, self).dispatch(*args, **kwargs)

    def get(self, request, username, **kwargs):
        u = get_object_or_404(User, pk=self.current_user_id(request))

        if u.username == username:
            cities_list=City.objects.filter(user_id__exact=self.current_user_id(request)).order_by('-kms')
            allcategories = Category.objects.all()
            allcities = City.objects.all()
            rating_list = Rating.objects.filter(user=u)
            totalMiles = 0
            for city in cities_list:
                totalMiles = totalMiles + city.kms

        return self.render_to_response({'totalMiles': totalMiles , 'cities_list':cities_list,'rating_list':rating_list,'allcities' : allcities, 'allcategories':allcategories})


class ManageAppView(LoginRequiredMixin, CheckTokenMixin, CurrentUserIdMixin,TemplateView):
    template_name = "accounts/thing.html"

    def compute_context(self, request, username):
        #some logic here                        
        if u.username == username:
            if request.GET.get('action') == 'delete':
                #some logic here and then:
                ShowAppsView.as_view()(request,username)

我做错了什么伙计们?

4

2 回答 2

55

代替

ShowAppsView.as_view()(self.request)

我不得不这样做

return ShowAppsView.as_view()(self.request)
于 2013-02-19T12:32:02.777 回答
1

当你开始在 python 中使用多重继承时,事情会变得更加复杂,所以你很容易用继承的 mixin 来践踏你的上下文。

您并没有完全说出您正在获得哪个上下文以及您想要哪个上下文(您没有定义新的上下文),因此很难完全诊断,但请尝试重新排列您的 mixin 的顺序;

class ShowAppsView(LoginRequiredMixin, CurrentUserIdMixin, TemplateView):

这意味着LoginRequiredMixin它将是第一个继承的类,因此如果它具有您要查找的属性,它将优先于其他类 - 如果没有,则 python 将查找CurrentUserIdMixin,依此类推。

如果您想真正确定您获得了您所追求的上下文,您可以添加一个覆盖,例如

def get_context(self, request):
    super(<my desired context mixin>), self).get_context(request)

以确保您获得的上下文是您想要的 mixin 中的上下文。

* 编辑 * 我不知道你在哪里找到compute_context的,但它不是 django 属性,所以只会ShowAppsView.get()ManageAppView.

于 2013-02-19T11:54:21.447 回答