2012-04-27 38 views
5

我有2個多表繼承車型,如這些創建/更新形式:Django的形式:最乾的方式來組織的繼承車型

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) 

同樣,對博文的形式類也從PostForm類繼承:

class PostForm(MapModelForm): 
    ... 
    class Meta: 
     model = Post 

    def clean(self): 
     ... 

class BlogPostForm(PostForm): 
    class Meta: 
     model = BlogPost 

我曾經在兩個非基於類的視圖中處理兩個模型的創建/更新。爲了讓事情變得乾乾淨淨,我決定試試Django的基於類的通用視圖。但是由於缺乏相關文件的例子和用戶不友善以及各種方法,我感到困惑。

這個想法是爲Post模型使用基於類的窗體視圖,並繼承它們爲BlogPost。我應該如何定製視圖類?

我應該分開PostCreate和PostUpdate視圖嗎?然後這兩個班級幾乎完全相同,根本不幹。

對於更新/創建帖子,我是否應該有一個FormView?它適用於創作,但我無法弄清楚如何爲更新做到這一點。

我應該使用提供的mixin類構建自定義視圖(或創建/更新的兩個視圖),而不是直接從視圖繼承?

回答

8

你說得對,基於類的視圖文檔是相當原始的。毫無疑問,它會改善,但目前你需要做好準備去嘗試和read the source

你正在嘗試做的兩件事情:

  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在運行時創建類)。但是,這可能是一個很大的步驟,直到你完全適應使用基於類的視圖。

+0

謝謝你的出色答案。 – omat 2012-04-27 14:17:40

+0

如何在不知道POST是要創建還是更新的情況下路由到良好的視圖?遵循這種結構有沒有一種好方法? – lajarre 2014-01-07 15:23:25