如何利用 django 通用视图?

Posted

技术标签:

【中文标题】如何利用 django 通用视图?【英文标题】:How to utilize django generic view? 【发布时间】:2014-04-25 18:17:58 【问题描述】:

例如,我想要一个页面,它可以让用户为不同类别的商品添加数据。

喜欢:

Model:Category是item的外键

Category1(detail url): 
    Item 1(detail url):
        Date(textbox), Amount(textbox), Price(textbox)
    Item 2:
        ...
Category2:
...
Save button, add more button, etc...

由于这是一个示例,我将那些东西都显示在一个页面中。

我不介意用普通的函数来写它们,但我想知道我是否可以利用这些视图,因为如果它们被大量引入和开发,它们可能会很强大。那么为什么不使用它呢?

谁能告诉我如何使用它们的技巧,或者如果我们想要更多功能,我们不应该使用它们?

【问题讨论】:

【参考方案1】:

Django 的通用视图涵盖了很多常见的用例。例如:

CreateView - 用于创建模型实例的视图 UpdateView - 用于更新模型现有实例的视图 DeleteView - 用于删除模型现有实例的视图 DetailView - 用于显示模型现有实例详细信息的视图 ListView - 用于显示模型实例列表的视图

如果您需要,还有更多内容,它们涵盖了您可能需要的大部分视图。您还可以扩展它们以满足您的需求。作为一般的经验法则,它们对构建东西的速度有如此巨大的影响,我建议默认使用它们,并且仅在绝对必要时才切换到编写自己的视图。如果您还没有学习它们,我认为这样做将是您时间的一项非常好的投资——您将很快弥补所花费的时间。对于很多视图类型,只需指定模型、设置 URL 和模板,就完成了。

如果您需要传递额外的数据,那么您可以扩展有问题的通用视图并覆盖get_context_data() 方法。如果同样需要应用于多个不同的通用视图,您可以创建一个包含该方法的 mixin,并将其包含在该通用视图中。

对于包含表单的视图,如 CreateView 和 UpdateView,正如 Drewness 所说,您可以通过一个 ModelForm 实例来告诉它要使用什么表单,并且该表单本身可以被覆盖,因此您仍然有很多控制权关于表格将做什么。例如,您可以定义以下形式:

from django.forms import ModelForm

class CategoryForm(ModelForm):
    exclude = ['date_created']

还有下面的观点

from django.views.generic.edit import CreateView

class CategoryCreateView(CreateView):
    model = Category
    form_class = CategoryForm

Django 教程covers generic views pretty well.

【讨论】:

我读过那些文章,但也许​​我还需要一个提示。就像在示例中一样,我们可以使用列表视图列出所有类别,似乎我们也可以使用表单视图来填充数据等。我的意思是我们如何将这些视图组合在一起?继承? “将这些视图组合在一起”是什么意思? 如果您指的是创建和编辑数据的视图,那么您可以为该数据指定一个表单。您可以为视图创建一个表单并将其传递给通用视图,它将使用该表单。该表单可以是ModelForm,直接从模型中派生 我现在有点困惑。但我想我的想法是,ListView 将获取对象列表,并传递给模板,然后呈现一个 HttpResponse 对象。而 CreateView 将获取一个对象,并呈现一个 HttpResponse 对象。我希望ListView的每个对象都有一个FormView,而我认为这两个进程是不兼容的,django将如何处理这些,这两个视图有两个例程,对吧?也许 mixin 会解决这个问题,虽然 mixin 是一个介于基本视图和通用视图之间的类。 非常感谢您的努力。我想列出所有类别,对于每个类别,我想列出它的所有项目,并且每个项目都有一个可以编辑它的表单。【参考方案2】:

您可以使用 Django 的 ModelFormFormView

然后,您的模型中的所有字段都将在您的表单和表单视图中可用。您还应该查看mixins。 Mixin 允许您使用基于类的视图的组合。

最后,如果您想在一个视图中使用多个表单(模型),您可以使用FormSet

【讨论】:

以上是关于如何利用 django 通用视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何自动化 django 通用视图的 url?

Django:如何检索“object_detail”通用视图选择的对象?

基于 Django 类的通用视图和 ModelForms

如何根据 Django 中当前基于类的通用视图模型向模板加载器添加路径

Django如何使用带有UUID而不是PK的通用视图

如何在 Django 通用列表视图类中使用 slugfield 创建链接?