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 つの非クラスベースのビューで両方のモデルの作成/更新を処理していました。DRY にするために、Django のクラスベースのジェネリック ビューを試してみることにしました。しかし、例がなく、関連するドキュメントやさまざまなアプローチのユーザーの不親切さのために、私は混乱しています。

アイデアは、Postモデルのクラス ベースのフォーム ビューを持ち、BlogPost. ビュークラスをどのように調整すればよいですか?

PostCreate ビューと PostUpdate ビューを別々にする必要がありますか? その場合、2 つのクラスはほぼ同一であり、DRY ではありません。

FormView投稿の更新と作成の両方に単一のものを使用する必要がありますか? 作成には機能しますが、更新のためにこれを行う方法がわかりませんでした。

ビューから直接継承するのではなく、提供された mixin クラスを使用してカスタム ビュー (または作成/更新用の 2 つのビュー) を構築する必要がありますか?

4

1 に答える 1

8

クラスベースのビュー ドキュメントが原始的であることは間違いありません。改善されることは間違いありませんが、今のところ、実験してソースを読む準備をする必要があります。

あなたは2つのことをしようとしています:

  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 に答える