2014-05-21 16 views
5

Quale opzione è la migliore, 1 o 2?I campi modello predefiniti devono essere impostati dal modulo o dal modello?

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

o 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

Forse qualcuno con più conoscenza potrebbe modificare questo titolo domanda per riflettere la domanda . È un po 'ambiguo e sembra non riflettere la domanda. – Deepend

+0

aggiorno il nome dell'argomento – user1624522

risposta

0

Dipende. Se questo dovrebbe essere applicato a tutti i modelli, allora è meglio nel modello. Ti assicurerà che ogni oggetto Topic avrà valori corretti, anche quelli che hai modificato dall'interfaccia di amministrazione.

Il modulo deve essere utilizzato solo per verificare i dati dall'utente e il modello è appropriato per automatizzare questo tipo di attività (generare dati prima di salvare l'oggetto). Attenzione, questo non dovrebbe sollevare eccezioni o invalidare i dati.

0

Personalmente preferirei la seconda opzione. Il modello dovrebbe definire anche la logica di business, mentre i moduli dovrebbero semplicemente gestire l'I/O utente. In questo modo la tua applicazione manterrà consistente anche se usata in modo programmatico (importata e chiamata da un altro codice).

4

La differenza è che la prima versione viene applicata solo quando si modificano gli oggetti tramite il modulo, mentre il secondo viene applicato ogni volta che il modello viene salvato (sebbene sia ancora un sottoinsieme di tutti i modi in cui le righe del database possono essere modificate in Django). Anche se attualmente crei solo oggetti tramite i moduli, penso che sia ancora una distinzione utile da tenere a mente.

Mi sembra che una combinazione di entrambi abbia senso nel tuo caso. Un slug è qualcosa che vorrete sempre impostare in base a name - cioè, è inerente al modello stesso. D'altra parte, l'idea di un client_ip sembra inesorabilmente legata alla nozione di creare un oggetto con un modulo tramite una richiesta web.

Naturalmente, si è in una posizione migliore per conoscere le specifiche di questo modello, ma questo è il modo generale con cui vorrei affrontare la domanda.

0

Non dovreste usare 2. suo meglio usare un segnale come pre-Save o post-save

Fonte: 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)