基于 Django 类的通用视图和 ModelForms

Posted

技术标签:

【中文标题】基于 Django 类的通用视图和 ModelForms【英文标题】:Django Class-Based Generic Views and ModelForms 【发布时间】:2011-10-04 19:01:29 【问题描述】:

与 Django 中有关通用视图的许多文档一样,我找不到明确描述如何将新的基于类的通用视图与 Django 表单一起使用的文档。

它是怎么做的?

【问题讨论】:

【参考方案1】:

到目前为止,您尝试了什么?基于类的视图非常新,文档中没有很多示例,所以我认为您需要亲自动手并进行实验!

如果您想更新现有对象,请尝试使用UpdateView。查看它使用的 mixin(例如 ModelFormMixinSingleObjectMixinFormMixin),看看您可以/必须重写哪些方法。

祝你好运!

【讨论】:

UpdateView 看起来是我需要的。如果我理解您正确链接点的文档,我什至不需要为我的表单编写单独的子类。我的问题是我对 Django 还很陌生,所以一些实际的工作示例对我很有帮助。谢谢你的链接。【参考方案2】:

将模型表单与基于类的视图一起使用的最简单方法是传入模型并在 url 中保留捕获的 slug / pk,在这种情况下,您无需编写任何视图代码。

url(r'^myurl/$', CreateView.as_view(model=mymodel)) 
#Creates a model form for model mymodel

url(r'^myurl/(?<pk>\w+)/$', UpdateView.as_view(model=mymodel)) 
#Creates a model form for model mymodel and updates the object having pk as specified in url

url(r'^myurl/(?<slug>\w+)/$', DeleteView.as_view(model=mymodel, slug_field="myfield")) 
#Creates a model form for model mymodel and deletes the object denoted by mymodel.objects.get(my_field=slug)

您还可以重写方法以获得更复杂的逻辑。您还可以传递查询集而不是模型对象。

另一种方法是在forms.py中创建一个modelform,然后将form_class传递给url作为

url(r'^myurl/$', CreateView.as_view(form_class=myform)) 

此方法允许您定义表单功能以及表单的 Meta 属性。

【讨论】:

如何使用通用版本的 create 将“条目”添加到类“类别”? class Category(models.Model): title = models.CharField) slug = models.CharField() entry = models.ManyToManyField(Entry) url(r'^myurl/$', CreateView.as_view(model=Category, template_name="template.html"))

以上是关于基于 Django 类的通用视图和 ModelForms的主要内容,如果未能解决你的问题,请参考以下文章

Django 基于类的通用视图和身份验证

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

Django - 基于类的通用视图 - “没有要重定向到的 URL”

从 Django 中基于类的通用视图自定义表单变量的首选方法是啥?

Django REST framwork-03-使用mixin和基于类的通用(generics)视图

从 Django 中基于类的通用视图将 request.user 对象发送到 ModelForm