2012-01-29 3 views
15

È tipico separare la convalida dell'input dalla convalida a livello di modello nei progetti Django? Ad esempio, la convalida che un nome utente si adatta ai criteri di denominazione sarebbe la convalida dell'input e la verifica che l'utente non sia già nel database sarebbe la convalida a livello di modello.Separazione dell'input del modulo e della convalida del modello in Django?

Ho osservato il codice di un collega e hanno inserito entrambi i tipi di convalida in una classe di modulo (in forms.py). È la configurazione tipica o è più comune che la convalida a livello di modello venga visualizzata nel modello o nella vista?

O c'è un modo migliore per avvicinarsi a questo-- come usare un ModelForm? Sono piuttosto nuovo a Django e sto cercando di imparare quale è lo schema consigliato per questa situazione.

risposta

12

Questa è una domanda molto interessante (per me).

A mio parere, tutti i codici di convalida devono essere spostati nel codice del modello. Questo è il modo per non violare le regole aziendali. Quando il codice di convalida è nel modello, non è possibile dimenticare alcune convalide in un nuovo modulo o disporre di regole incoerenti in varie forme.

I link a te 'Django, Raise a validation error in a model's save method' domanda correlata alla tua. Sotto la domanda è possibile vedere come convalidare le convalide dei codici dai moduli al modello. Spero che questa breve introduzione possa aiutarti.

Da quale struttura arrivi? Come vengono scritte le regole di convalida nel tuo ambiente?

+3

Sono d'accordo. La maggior parte delle cose può essere pensata come una convalida "a livello di modello". Davvero non vuoi mai un nome utente per colpire il database se non corrisponde ai criteri di denominazione. Ci sono alcune cose che variano da una forma all'altra, ed è qui che si desidera convalidare il modulo stesso. Potresti avere un modello di file di fantasia che contiene il tipo di file in un campo. Qualsiasi tipo è ok a livello di modello, ma nel modulo di caricamento delle foto si desidera limitarlo a png e jpeg, ad esempio. – dokkaebi

8

Non sono d'accordo con la risposta accettata. Preferisco utilizzare la convalida a livello di modello per evitare incongruenze nei modelli e convalida a livello di modulo per eventuali restrizioni specifiche del sito.

Supponiamo di avere un modello per eventi, con i campi datetime per l'ora di inizio e di fine. La convalida del modello ci costringerebbe ad avere un tempo di fine che viene dopo l'ora di inizio. Tuttavia, lo lascerei nel modulo per convalidare che l'evento appena creato non è nel passato. Pertanto, se mai dovessi aggiungere un evento verificatosi in passato, potrei utilizzare un modulo specifico dell'amministratore che consente date in passato o semplicemente aggiungerlo direttamente al database.

Pertanto, la convalida del modello deve solo verificare i valori che sono palesemente errati. ma se hai mai bisogno di fare qualcosa di funky (caratteri Unicode in un nome utente per un bot, per esempio), dovrebbe permetterti di farlo, anche se è solo attraverso l'admin o la shell. Ho letto una risposta su StackOverflow che suggeriva di utilizzare sempre moduli in codice backend, riempiendo campi con codice come form["field"] = "value", per beneficiare della convalida coerente.

+1

Per lo scenario di esempio, è possibile avere il campo userId sulla tabella 'event' e consentire il modulo di riempimento con date precedenti per alcuni utenti del gruppo. Per ogni esempio che pubblichi posso trovare un controesempio come questo;) Ma questo è il mio approccio, sono sicuro che per alcune regole, la validazione del modulo sarà la soluzione migliore. – danihp

+0

Ovviamente è anche possibile implementarlo nel modello, ma poi si sta lavorando in funzionalità in qualcosa che dovrebbe essere il modulo. Se vuoi riutilizzare il tuo modello Blog altrove, perché dovrebbe importare se il post appartiene a un utente in un gruppo chiamato "admin"? Poiché questo requisito può cambiare da un sito a un altro, è meglio lasciarlo in una forma piuttosto che nel modello stesso. – sleblanc

+0

forse, in futuro, la tua app Web avrà una pausa completa. È solo un esempio Grazie per condividere la tua comunità, è il benvenuto. – danihp