Django 表单:为继承模型组织创建/更新表单的最 DRY 方式
Posted
技术标签:
【中文标题】Django 表单:为继承模型组织创建/更新表单的最 DRY 方式【英文标题】:Django forms: most DRY way to organize create / update forms for inherited models 【发布时间】:2012-05-08 02:30:42 【问题描述】:我有 2 个这样的多表继承模型:
class Post(models.Model):
title = models.CharField(max_length=100, blank=True, null=True)
text = models.TextField(blank=True, null=True)
location = models.PointField()
...
class BlogPost(Post):
blog = models.ForeignKey(Blog)
同样,BlogPost 的表单类也继承自 PostForm 类:
class PostForm(MapModelForm):
...
class Meta:
model = Post
def clean(self):
...
class BlogPostForm(PostForm):
class Meta:
model = BlogPost
我曾经在 2 个非基于类的视图中处理两个模型的创建/更新。为了让事情变得干燥,我决定尝试一下 Django 的基于类的通用视图。但是由于相关文档缺乏示例和用户不友好以及各种方法,我感到困惑。
这个想法是为Post
模型提供基于类的表单视图,并为BlogPost
继承它们。我应该如何定制视图类?
我应该有单独的 PostCreate 和 PostUpdate 视图吗?然后这两个类几乎相同,根本不是 DRY。
我应该有一个FormView
来更新/创建帖子吗?它适用于创建,但我不知道如何进行更新。
我应该使用提供的 mixin 类而不是直接从视图继承来构建自定义视图(或用于创建/更新的两个视图)吗?
【问题讨论】:
【参考方案1】:您说得对,基于类的视图文档相当原始。毫无疑问,它会有所改善,但目前您需要准备好进行实验并前往read the source。
你正在尝试做两件事:
-
找到一种使用类来组织视图的好方法。
重构代码以避免重复。
一次解决这些问题很重要。首先找出正确的类层次结构,然后然后弄清楚如何排除重复。
让我们试一试。您的类层次结构将如下所示:
from django.views import generic
class PostCreateView(generic.CreateView):
form_class = PostForm
model = Post
class PostUpdateView(generic.UpdateView):
form_class = PostForm
model = Post
class BlogPostCreateView(generic.CreateView):
form_class = BlogPostForm
model = BlogPost
class BlogPostUpdateView(generic.UpdateView):
form_class = BlogPostForm
model = BlogPost
这涉及大量重复,但现在很清楚如何分解其中的一些:
from django.views import generic
class PostView(generic.FormView):
form_class = PostForm
model = Post
class PostCreateView(PostView, generic.CreateView): pass
class PostUpdateView(PostView, generic.UpdateView): pass
class BlogPostView(PostView):
form_class = BlogPostForm
model = BlogPost
class BlogPostCreateView(BlogPostView, generic.CreateView): pass
class BlogPostUpdateView(BlogPostView, generic.UpdateView): pass
如果您仍然对这里的重复量不满意,您可以进一步自动化这些类的构建(使用type
在运行时创建类)。不过,在您完全习惯使用基于类的视图之前,这可能有点过头了。
【讨论】:
不知道POST是要创建还是要更新时如何路由到好视图?按照这种结构,有没有好的方法来做到这一点?以上是关于Django 表单:为继承模型组织创建/更新表单的最 DRY 方式的主要内容,如果未能解决你的问题,请参考以下文章
Django:如何在手动表单字段中显示模型的外键对象作为选择