子类化 Django ListView
Posted
技术标签:
【中文标题】子类化 Django ListView【英文标题】:Subclassing Django ListView 【发布时间】:2012-09-26 02:05:44 【问题描述】:我正在使用 Django v1.4,并且正在尝试对通用 ListView 视图进行子类化。这是代码
from django.views.generic import ListView
class SearchListView(ListView):
model = None
fields = None
def get_queryset(self):
#...etc...
return super(SearchListView, self).get_queryset()
然后我将针对特定模型进一步定制该视图:
class PersonSearchListView(SearchListView):
model = Person
fields = ['first_name', 'last_name']
所以发生的情况是,ImproperlyConfigured 异常是超类 (ListView),表明应该定义模型或查询集。我以为我是……(模型=人)。为什么这个值没有进入视图?
谢谢
【问题讨论】:
也许您可以尝试从 SearchListView 中删除模型 = None 和 fields = None。您能否发布实例化 PersonSearchListView 的代码?我的猜测是,在初始化 PersonSearchListView 时,它首先调用 SearchListView 构造函数,但是当它构造 SearchListView 时,模型仍然是 None。 实例化 PersonSearchListView 的代码在 urls.py 中。 PersonSearchListView.as_view()。结果证明在 SearchListView 类中声明模型和字段是可以的。实际上,我不知道我做了什么让它工作。我的代码充满了失败的尝试。我试图让它恢复到与我上面的示例代码内联,突然它就可以工作了。我在想我在某处有一个类名拼写错误或 urls 配置问题。 :) 是的,保持代码干净很重要,它可以防止出现大量错误并使查找错误变得更加容易。从长远来看,它将为您节省时间。 【参考方案1】:当您拨打super(SearchListView, self).get_queryset()
时
您将调用以下类的 get_queryset,如您所见,如果您未设置模型或查询集,它将引发异常。
ListView 是 MultipleObjectMixin 的子视图。
但是如果你实例化一个 PersonSearchListView,那么模型应该已经被正确设置了。你能包括url配置吗?稍后会尝试并更新我的答案。
class MultipleObjectMixin(ContextMixin):
"""
A mixin for views manipulating multiple objects.
"""
allow_empty = True
queryset = None
model = None
paginate_by = None
context_object_name = None
paginator_class = Paginator
def get_queryset(self):
"""
Get the list of items for this view. This must be an iterable, and may
be a queryset (in which qs-specific behavior will be enabled).
"""
if self.queryset is not None:
queryset = self.queryset
if hasattr(queryset, '_clone'):
queryset = queryset._clone()
elif self.model is not None:
queryset = self.model._default_manager.all()
else:
raise ImproperlyConfigured("'%s' must define 'queryset' or 'model'"
% self.__class__.__name__)
return queryset
【讨论】:
以上是关于子类化 Django ListView的主要内容,如果未能解决你的问题,请参考以下文章
Django:为啥要为 UserProfile 创建 OneToOne 而不是子类化 auth.User?
Django 表单子类化 - 如何修改继承字段的某些属性,同时保留其他属性?