2009-09-17 12 views
6

Ho un modello come questo con Django 1.1:Does model.CharField ('blank = False') funziona con save()?

class Booking(models.Model): 
    name = models.CharField(max_length=100) 

Per impostazione predefinita, sto leggendo che sia 'nulla' e 'in bianco' sono false.

Così con un test come questo ...

class SimpleTest(TestCase): 
    def test_booking_save(self): 
     b = Booking() 
     b.save() 

... mi aspettavo che il salvataggio un'eccezione. Ma non è così. Sembra abbastanza felice di creare un nuovo record con un nome vuoto (Postgres e SQLite3).

Ho notato che tramite l'interfaccia di amministrazione un salvataggio effettivamente fallisce con un "questo campo è richiesto".

Le domande sono:

  1. è il 'vuoto' attributo applicato solo da forme?
  2. La correzione sostituisce il metodo save() e controlla esplicitamente len (nome)! = 0?
  3. Ho frainteso qualcosa che, una volta capito, risolve il mio malinteso?
+0

La risposta al titolo è "No". Sembra prassi comune assumere dati validi sul modello e affidare la convalida al modulo. –

+0

http://stackoverflow.com/questions/6940499/how-can-you-create-a-non-empty-charfield-in-django –

risposta

5

UPDATE: Vedere il model validation documentation nelle versioni più recenti di Django.

Risposta originale: blank=True/False only applies to forms. La convalida dei dati attualmente avviene solo a livello di modulo; questo cambierà quando lo model-validation Google Summer of Code work verrà unito al trunk.

L'unico tipo di convalida che si verifica attualmente nel livello del modello è qualsiasi errore verrà generato dal back-end del database se non è in grado di gestire ciò che ottiene. Nel caso di un CharField vuoto, in genere non otterrai mai errori dal database, poiché Django imposta il campo su una stringa vuota per impostazione predefinita.

Per ora, è necessario utilizzare il metodo save() per qualsiasi convalida a livello di modello desiderata. Presto (se sei su tronco) o quando esce 1.2, usa il materiale di validazione del modello.

+1

Sembra una vecchia risposta, ma la domanda sembra essere ancora rilevante? Che cosa mai è successo qui? – Lucretiel

+0

Una discussione più recente: https://stackoverflow.com/questions/17816229 – texnic

1

Dal Django Docs:

"Si noti che i valori di stringa vuoti otterrà sempre memorizzati come stringhe vuote, non come NULL Utilizzare solo nulla = True per i campi non di tipo stringa, come interi, booleani e le date.. "

Il codice sta memorizzando una stringa vuota.

Per illustrare questo, provare:

class SimpleTest(TestCase): 
    def test_booking_save(self): 
     b = Booking() 
     b.name = None 
     b.save() 
+0

Vero, ma non risponde alla domanda posta. –

+3

Sì, in effetti sta memorizzando una stringa vuota. Questo è il problema. Poiché 'blank' è impostato su 'False', mi sarei aspettato che impedisse quello. –

Problemi correlati