Django通用UpdateView和多重继承

时间:2016-03-30 18:37:57

标签: django django-forms django-views

我们说我有以下型号:

class Post(model):
    ...

class BlogPost(Post):
    ...

class OtherPost(Post):
    ...

假设我的url架构编辑帖子类似于

/site/post/\d+/edit

换句话说,我没有单独的网址路径来编辑OtherPostsBlogPost

使用UpdateView时,我需要设置模型 - 当然,实际模型是Post的子类。

class Update(generics.UpdateView):
    model = Post

Djangoey / DRY处理这个问题的方法是什么?

目前,查看UpdateView代码,看起来我可以保留Update.model未定义,并覆盖get_queryset,这需要返回具有正确子模型的查询。我还需要覆盖get_form以返回正确的表单。

当我开始工作时,我会发布我的解决方案,但我正在寻找更好的(DRYer)集成。

1 个答案:

答案 0 :(得分:0)

看起来以下方法正常工作,这似乎相当小。

class Update(generic.edit.UpdateView):
    model = Post

    def get_form_class(self):                                                   
      try:                                                                    
          if self.object.blogpost:                                    
              return BlogPostForm
      except Post.DoesNotExist:                                          
          pass                                                                

      try:                                                                    
          if self.object.otherpost:                                     
              return OtherPostForm                                
      except Post.DoesNotExist:                                          
          pass                                                                

      def get_object(self, queryset=None):                                        
          object = super(Update, self).get_object(queryset)                       

          try:                                                                    
              return object.blogpost
          except Post.DoesNotExist:                                          
              pass                          

          try:                                                                    
              return object.otherpost
          except Post.DoesNotExist:                                          
              pass                                  

或者,如果使用像InheritanceManager这样的多态混合,那么就像这样:

class Update(generic.edit.UpdateView):
    model = Post
    form_class = {
        BlogPost: BlogPostForm,
        OtherPost: OtherPostForm,
    }

    def get_form_class(self):                                                   
       return self.form_class[self.object.__class__]

   def get_queryset(self):                                                     
      return self.model.objects.select_subclasses()