5

我有 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 类而不是直接从视图继承来构建自定义视图(或用于创建/更新的两个视图)吗?

4

1 回答 1

8

你说得对,基于类的视图文档相当原始。毫无疑问,它会有所改进,但目前您需要准备好进行实验并阅读源代码

您正在尝试做两件事:

  1. 找到一种使用类来组织视图的好方法。
  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用于在运行时创建类)。不过,在您完全习惯使用基于类的视图之前,这可能有点过头了。

于 2012-04-27T12:12:18.147 回答