在我的
ProductList
课程中,当我尝试在另一种方法中调用 get_context_data
时,出现错误 'ProductList' object has no attribute 'object_list'
def get_context_data(self, **kwargs):
c = super(ProductList, self).get_context_data(**kwargs)
c['category'] = self.category
c['category_menu'] = self.get_category_menu()
c['filters'] = self.filters
c['expanded_filters'] = self.get_expanded_filters()
c['active_filters'] = self.get_active_filters()
c['category_list'] = self.category.get_children().filter(in_lists=True)
c['colors_list'] = self.get_colors_list(c['object_list'])
return c
def get_queryset(self):
data = self.get_context_data()
导致此错误的原因是什么?
如何在第二种方法中获得
object_list
?
您可能会在超类的get_context_data()
中的
line之后收到错误:
queryset = kwargs.pop('object_list', self.object_list)
的
BaseListView
方法通过调用object_list
方法在视图上设置get_queryset
:
self.object_list = self.get_queryset()
但是,在您的情况下,您在
get_context_data()
方法本身中调用 get_queryset
,并且当时 object_list
未在视图上设置。
抱歉问了这么模糊的问题。这只是我第一次尝试 Django。我阅读了一些文档,意识到我实际上可以使用
filter()
: 获取我需要的对象列表
data = self.model.objects.filter(categories__in=self.get_category_menu())
您必须从 kwargs 中手动设置
object_list
中的 get_context_data
。 ListView 不支持 POST 请求,因此您必须确保该属性可用。
例如,如果您的
context_object_name
是 foo
:
class MyListWithFormView(FormMixin, ListView):
...
def get_context_data(self, **kwargs):
if kwargs.get('foo'):
self.object_list = kwargs.get('foo')
etc...
return ctx
...
def form_invalid(self, form):
ctx = self.get_context_data(
form=form,
foo=self.get_queryset()
)
return self.render_to_response(ctx)