2016-03-30 3 views
0

Lassen Sie uns sagen, dass ich die folgenden Modelle haben:Django Generisches UpdateView und Multitable Vererbung

class Post(model): 
    ... 

class BlogPost(Post): 
    ... 

class OtherPost(Post): 
    ... 

meine url Schema Angenommen einen Beitrag zu bearbeiten ist so etwas wie,

/site/post/\d+/edit 

Mit anderen Worten, I don‘ t haben separate URL-Pfade zum Bearbeiten OtherPosts vs BlogPost.

Bei der Verwendung von UpdateView muss ich das Modell festlegen - aber natürlich ist das eigentliche Modell eine Unterklasse von Post.

class Update(generics.UpdateView): 
    model = Post 

Was ist der Djangoey/DRY-Weg, damit umzugehen?

Im Moment, mit Blick auf den UpdateView Code, sieht es so aus, als könnte ich Update.model undefiniert lassen, und überschreiben get_queryset, die eine Abfrage mit dem richtigen Submodell zurückgeben müsste. Ich müsste auch get_form überschreiben, um das richtige Formular zurückzugeben.

Ich poste meine Lösung, wenn ich es funktioniere, aber suche nach möglicherweise besseren (DRYer) Integrationen.

Antwort

0

Es sieht aus wie die folgende Methode funktioniert, die ziemlich minimal scheint.

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         

Oder, wenn eine polymorphe mixin wie InheritanceManager verwenden, dann so etwas wie dieses:

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() 
Verwandte Themen