子类化 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 模型子类化方法

Django:为啥要为 UserProfile 创建 OneToOne 而不是子类化 auth.User?

Django 表单子类化 - 如何修改继承字段的某些属性,同时保留其他属性?

如何子类化 Django TextChoices 以添加其他属性?

如何使子类化的自定义 Django 表单字段不再是必需的?

为 django 1.5 自定义用户模型子类化 django-registration 1.0 表单