如何使用基于类的视图渲染多个对象

时间:2013-03-03 17:27:05

标签: django class-based-views

我尝试使用基于类的视图渲染多个对象,但是我收到错误。

以下是我的代码:

class AssociatedList(WizardRequiredMixin, TemplateView):
    template_name = "profile/associated_accounts.html"

    def get_context_data(self, **kwargs):
        context = super(AssociatedList, self).get_context_data(**context)
        all_envelopes = Envelope.objects.filter(
            user=request.user).exclude_unallocate()
        free_limit = account_limit(request, 15, all_envelopes)
        facebook = FacebookProfile.user_profiles(request.user)
        google = GoogleProfile.user_profiles(request.user)
        twitter = TwitterProfile.user_profiles(request.user)

        context.update = ({
            'facebook': facebook,
            'google': google,
            'twitter': twitter,
            'free_limit': free_limit,
        })
        return context

错误:

  local variable 'context' referenced before assignment

3 个答案:

答案 0 :(得分:2)

我总是通过在函数开头调用get_context_data然后附加上下文来覆盖super -

def get_context_data(self, *args, **kwargs):
    context = super(AssociatedList, self).get_context_data(*args, **kwargs)
    all_envelopes = Envelope.objects.filter(
        user=self.request.user).exclude_unallocate()
    free_limit = account_limit(self.request, 15, all_envelopes),
    facebook = FacebookProfile.user_profiles(self.request.user),
    google = GoogleProfile.user_profiles(self.request.user),
    twitter = TwitterProfile.user_profiles(self.request.user),

    context.update({
        'facebook': facebook,
        'google': google,
        'twitter': twitter,
        'free_limit': free_limit,
    })
    return context

这是文档here中使用的模式。

更新

您刚刚添加的错误表明您的课程出错。听起来您需要定义queryset属性或model属性。

您继承的ListView类要求您定义View返回的模型(即YourModel.objects.all())。或者返回特定的查询集(例如YourModel.objects.filter(your_field=some_variable))。

答案 1 :(得分:2)

因为这是一个ListView,您需要告诉它您要列出的modelqueryset。在这种情况下,您不想使用ListView,因为您要覆盖get_context_data,因此您应该使用TemplateView或类似的东西。

答案 2 :(得分:1)

尝试这样的事情:

class AssociatedList(WizardRequiredMixin, ListView):
    template_name = "profile/associated_accounts.html"
    model = Envelope 

    def get_queryset(self):
        return Envelope.objects.filter(user=self.request.user).exclude_unallocate()

    def get_context_data(self, **kwargs):
        context = super(AssociatedList, self).get_context_data(**kwargs)
        context.update({
            'facebook': FacebookProfile.user_profiles(self.request.user),
            'google': GoogleProfile.user_profiles(self.request.user),
            'twitter': TwitterProfile.user_profiles(self.request.user),
            'free_limit': account_limit(self.request, 15, context['envelope_list']),
        })
        return context

您不需要具有查询集的模型,但最好定义它。 在模板中使用object_list或envelope_list而不是all_envelopes,你应该好好去。

P.S。 http://ccbv.co.uk/关于CBV的良好知识来源。