基于 Django 类的通用视图和 ModelForms
Posted
技术标签:
【中文标题】基于 Django 类的通用视图和 ModelForms【英文标题】:Django Class-Based Generic Views and ModelForms 【发布时间】:2011-10-04 19:01:29 【问题描述】:与 Django 中有关通用视图的许多文档一样,我找不到明确描述如何将新的基于类的通用视图与 Django 表单一起使用的文档。
它是怎么做的?
【问题讨论】:
【参考方案1】:到目前为止,您尝试了什么?基于类的视图非常新,文档中没有很多示例,所以我认为您需要亲自动手并进行实验!
如果您想更新现有对象,请尝试使用UpdateView
。查看它使用的 mixin(例如 ModelFormMixin
、SingleObjectMixin
、FormMixin
),看看您可以/必须重写哪些方法。
祝你好运!
【讨论】:
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 - 基于类的通用视图 - “没有要重定向到的 URL”
从 Django 中基于类的通用视图自定义表单变量的首选方法是啥?