gpt4 book ai didi

Django 表单 : most DRY way to organize create/update forms for inherited models

转载 作者:行者123 更新时间:2023-12-01 21:43:58 25 4
gpt4 key购买 nike

我有 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

我曾经在两个非基于类的 View 中处理两个模型的创建/更新。为了让事情变得干燥,我决定尝试一下 Django 基于类的通用 View 。但由于缺乏示例,相关文档对用户不友好,方法也多种多样,我很困惑。

这个想法是为 Post 模型提供基于类的表单 View ,并为 BlogPost 继承它们。我应该如何定制 View 类?

我应该有单独的 PostCreate 和 PostUpdate View 吗?那么这两个类几乎是相同的,而且一点也不 DRY。

我应该有一个 FormView 来更新/创建帖子吗?它适用于创建,但我不知道如何执行此操作以进行更新。

我应该使用提供的 mixin 类构建自定义 View (或两个用于创建/更新的 View ),而不是直接从 View 继承吗?

最佳答案

你说得对,基于类的 View 文档相当原始。毫无疑问它会有所改善,但目前您需要准备好进行实验并read the source .

您正在尝试做两件事:

  1. 找到一种使用类来组织 View 的好方法。
  2. 重构您的代码以避免重复。

一次解决这些问题很重要。首先找出正确的类层次结构,然后才弄清楚如何排除重复。

我们来试试吧。您的类层次结构将如下所示:

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 在运行时创建类)。不过,在您完全熟悉基于类的 View 的使用之前,这可能有点太过了。

关于Django 表单 : most DRY way to organize create/update forms for inherited models,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10348987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com