2014-05-20 94 views
0

我想从django CBV中的form_valid()中取出公共代码。代码如下:继承似乎并没有工作

class GenericCreate(CreateView): 
    def form_valid(self, form): 
     form.instance.usercreator = self.request.user 
     form.instance.slug = unique_slug(form.instance.headline, Article) 
     return super(GenericCreate, self).form_valid(form) 

class ArticleCreate(GenericCreate): 
    success_url = '/' 
    form_class = ArticleForm 
    template_name = "articles/article_form.html" 


class OrganizationCreate(GenericCreate): 
    success_url = '/' 
    form_class = OrganizationForm 
    template_name = "organizations/organization_form.html" 

    def form_valid(self, form): 
     form.instance.pub_date = timezone.now() 
     #  form.instance.usercreator = self.request.user # no error if this is uncommented 
     return super(GenericCreate, self).form_valid(form) 

当OrganizationForm提交,OrganizationCreate形式被处理,但usercreator似乎并没有得到来自GenericCreate类设置...我收到以下错误:

NOT NULL constraint failed: articles_article.usercreator_id 

当我在OrganizationCreate.form_valid()中强制form.instance.usercreator = self.request.user时,我不会收到此错误。

这就好像继承不起作用。如何避免在OrganizationCreate.form_valid()中显式设置createuser并使用GenericCreate.form_valid()?

回答

0

您打电话给super的班级不对。在OrganizationCreate中,您必须致电super(OrganizationCreate, self)super的第一个参数应该与您调用它的类相同。您的调用的效果是GenerticCreate在继承层次结构中被跳过,所以它的方法不会被调用。