如何利用 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 的 ModelForm
和 FormView
。
然后,您的模型中的所有字段都将在您的表单和表单视图中可用。您还应该查看mixins。 Mixin 允许您使用基于类的视图的组合。
最后,如果您想在一个视图中使用多个表单(模型),您可以使用FormSet
。
【讨论】:
以上是关于如何利用 django 通用视图?的主要内容,如果未能解决你的问题,请参考以下文章
Django:如何检索“object_detail”通用视图选择的对象?