2014-05-21 13 views
5

Welche Option ist am besten, 1 oder 2?Sollen Standardmodellfelder durch das Formular oder das Modell festgelegt werden?

1.

class TopicForm(forms.Form): 

    name = forms.CharField(required=True) 
    body = RichTextFormField(required=True) 

    def save(self, request): 
     t = models.Topic(user=request.user, 
         site=get_current_site(request), 
         name=self.cleaned_data['name'], 
         body=self.cleaned_data['body']) 
     t.slug = slugify(self.name) 
     t.body_html = seo.nofollow(seo.noindex(self.body)) 
     t.ip = utils.get_client_ip(request) 
     t.save() 

oder 2.

class Topic(models.Model): 
    ... 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     self.body_html = seo.nofollow(seo.noindex(self.body)) 
     self.ip = utils.get_client_ip(request) 
     super(Topic, self).save(*args, **kwargs) 
+0

Vielleicht hat jemand mit mehr Wissen könnte diese Frage Titel bearbeiten, um die Frage zu reflektieren . Es ist ein wenig mehrdeutig und scheint die Frage nicht zu reflektieren. – Deepend

+0

Ich aktualisiere den Themennamen – user1624522

Antwort

0

Es hängt davon ab. Wenn dies für alle Modelle gilt, ist es im Modell besser. Es wird Ihnen versichern, dass jedes Topic Objekt korrekte Werte haben wird, sogar diejenigen, die Sie von der Admin-Oberfläche aus bearbeiten.

sollte die Form nur Daten zu überprüfen, von dem Benutzer verwenden werden und das Modell ist angemessen, diese Art von Aufgabe zu automatisieren (Daten erzeugen, bevor das Objekt zu speichern). Seien Sie vorsichtig, dies sollte jedoch keine Ausnahme auslösen oder Daten ungültig machen.

0

Persönlich würde ich die zweite Option bevorzugen. Das Modell sollte auch die Geschäftslogik definieren, während Formulare nur Benutzer-E/A behandeln sollten. Auf diese Weise bleibt Ihre Anwendung auch bei programmatischer Verwendung (importiert und aus anderem Code aufgerufen) konsistent.

4

Der Unterschied besteht darin, dass die erste Version nur beim Ändern von Objekten über das Formular angewendet wird, während die zweite immer dann angewendet wird, wenn das Modell gespeichert wird (obwohl dies immer noch eine Teilmenge aller Arten von Datenbankzeilen ist) Django). Auch wenn Sie derzeit nur Objekte über Formulare erstellen, denke ich, dass dies immer noch eine nützliche Unterscheidung ist.

Es sieht für mich wie eine Mischung der beiden sinnvoll in Ihrem Fall aus. Ein slug ist etwas, das Sie immer auf name setzen wollen - das heißt, es ist inhärent das Modell selbst. Auf der anderen Seite scheint die Idee eines client_ip unaufhaltsam auf den Begriff gebunden über eine Web-Anforderung, ein Objekt mit einer Form zu schaffen.

Natürlich sind Sie in einer besseren Position, über die Besonderheiten dieses Modell zu wissen, aber das ist die allgemeine Art, wie ich die Frage nähern würde.

0

Sie sollten nicht 2. verwenden es besser, ein Signal wie die Verwendung vorge speichern oder Post-Save

Quelle: https://docs.djangoproject.com/en/dev/topics/signals/

@receiver(pre_save, sender=Topic) 
    def topic_pre_save_handler(sender, instance, **kwargs): 
     instance.slug = slugify(self.name) 
     instance.body_html = seo.nofollow(seo.noindex(self.body)) 
     instance.ip = utils.get_client_ip(request) 
Verwandte Themen