2013-05-06 15 views
5

Sfondo

ho un modello con due campi che sono fissati il ​​vuoto:Perché in django.forms.CharField manca "vuoto", ma presente in django.db.models.CharField?

class News(models.Model):                                               
    title = models.CharField(max_length = 50, blank = True)                                       
    info = models.TextField(blank = True) 

Il fatto è che voglio impostare la max_length dinamicamente quando il modulo viene costruito, quindi ho un modulo personalizzato :

class NewsForm(forms.ModelForm):                                              
    def __init__(self, *args, **kwargs):                                            
     super(NewsForm, self).__init__(*args, **kwargs)                                        

     title_max_length = 20                                              
     info_max_length = 100                                              

     self.fields["title"] = forms.CharField(max_length = title_max_length)                                  
     self.fields["info"] = forms.CharField(                                          
      widget = forms.Textarea,                                             
      validators = [                                               
       MaxLengthValidator(info_max_length)                                         
      ]                                                  
     ) 

Nota: Questi due valori di lunghezza sono in realtà recuperati dal database, ma ho scelto di non includere il codice per mantenere gli esempi più breve.

Il problema

Quando sto usando quelli campi personalizzati l'opzione blank viene sovrascritto/ignorato.

Ho provato semplicemente aggiungendo il max_length, widget e validatori per i campi esistenti, in questo modo:

class NewsForm(forms.ModelForm):                                              
    def __init__(self, *args, **kwargs):                                            
     super(NewsForm, self).__init__(*args, **kwargs)                                        

     title_max_length = 20                                              
     info_max_length = 100                                              

     self.fields["title"].max_length = title_max_length                                       
     self.fields["info"].widget = forms.Textarea                                         
     self.fields["info"].validators = [MaxLengthValidator(info_max_length)] 

Nel fare questo l'opzione blank funziona, ma il max_length dinamica non viene applicato alla forma.

Ho provato a cercare nella fonte Django, ma sono abbastanza nuovo quindi è troppo a prendere in questo momento.

C'è qualche modo per raggiungere questo obiettivo?

+2

Hai provato ad aggiungere il parametro = False richiesto al modulo? –

+0

@AlagappanRamu: No, non l'ho fatto. Ero così concentrato sulla ricerca di "vuoto" che mi è sfuggito di più nei documenti. Ho aggiunto 'required = False' nella creazione' CharField' e questo ha risolto il problema. Scrivi il tuo commento come risposta in modo da poterlo accettare e revocarlo. Grazie! – rzetterberg

+0

Aggiunto come risposta! Grazie. –

risposta

12

Quando si crea il modulo, aggiungere il seguente parametro CharField a parte il max_length, widget e validatori:

forms.CharField(...,required = False) 

In Django, vuoto = True nei modelli è correlata alla richiesta = False in forme.

+0

non funziona per me in Django 1.11, chiede ancora in Django Admin Opere dopo il riavvio del server (hmm, di solito auto-ricarica) –