2012-04-27 11 views
5

Ho 2 modelli multi-tavolo ereditati come questi:forme Django: modo più DRY organizzare creare moduli/aggiornamento per i modelli ereditati

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) 

Analogamente, classe form per BlogPost eredita dalla classe PostForm:

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

    def clean(self): 
     ... 

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

Ero abituato a gestire la creazione/aggiornamento per entrambi i modelli in 2 viste non basate su classi. Per rendere le cose ASCIUTTE, ho deciso di provare le viste generiche basate sulla classe di Django. Ma a causa della mancanza di esempi e della scortesia degli utenti nei documenti correlati e nella varietà di approcci, sono confuso.

L'idea è quella di avere una vista di forma a base di classe per il modello Post e li erediterà per il BlogPost. Come dovrei personalizzare le classi vista?

Devo avere viste PostCreate e PostUpdate separate? Quindi le due classi sono quasi identiche e non ASCIUGANO affatto.

Devo avere un singolo FormView sia per l'aggiornamento/creazione di un post? Funziona per la creazione ma non sono riuscito a capire come farlo per l'aggiornamento.

Devo creare una vista personalizzata (o due viste per creare/aggiornare) utilizzando le classi di mixin fornite invece di ereditare direttamente dalle viste?

risposta

8

Hai ragione che la documentazione di visualizzazione basata su classi è piuttosto primitiva. Senza dubbio migliorerà, ma per il momento devi essere pronto a sperimentare e a read the source.

si sta cercando di fare due cose:

  1. trovare un buon modo per organizzare le vostre opinioni utilizzando le classi.
  2. Rif. Codice per evitare ripetizioni.

È importante affrontare questi uno alla volta. Calcolare prima la giusta gerarchia delle classi, e solo quindi capire come calcolare la ripetizione.

Proviamo. La vostra gerarchia delle classi è andare a guardare qualcosa di simile:

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 

Questo comporta un sacco di ripetizione, ma è chiaro ora come fattore fuori alcuni di essi:

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 

E se siete ancora insoddisfatti della quantità di ripetizioni qui, è possibile automatizzare ulteriormente la costruzione di queste classi (utilizzando type per creare classi in fase di runtime). Probabilmente è un passo troppo lungo, fino a quando non sei completamente a tuo agio con l'uso delle visualizzazioni basate sulla classe.

+0

grazie per la brillante risposta. – omat

+0

Come indirizzare alla visualizzazione corretta quando non si sa se il POST sta per creare o aggiornare? C'è un buon modo per farlo seguendo questa struttura? – lajarre

Problemi correlati