我尝试使用基于类的视图渲染多个对象,但是我收到错误。
以下是我的代码:
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
答案 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,您需要告诉它您要列出的model
或queryset
。在这种情况下,您不想使用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的良好知识来源。