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?
Hai provato ad aggiungere il parametro = False richiesto al modulo? –
@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
Aggiunto come risposta! Grazie. –