2013-04-25 10 views
40

Ho una forma simile a questo:Django ModelForm non richiesto campo

class My_Form(ModelForm): 
    class Meta: 
     model = My_Class 
     fields = ('first_name', 'last_name' , 'address') 

Come faccio a mettere il campo indirizzo di optional?

+1

Che aspetto ha il modello? – Ngenator

risposta

43

Immagino il vostro modello è simile a questo:

class My_Class(models.Model): 

    address = models.CharField() 

Il modulo:

class My_Form(ModelForm): 

    address = forms.CharField(required=False) 

    class Meta: 
     model = My_Class 
     fields = ('first_name', 'last_name' , 'address') 
+1

E il campo chiave esterna? – digz6666

+10

Utilizzare ModelChoiceField. Quindi, se le definizioni dei campi sono 'abc = models.ForeignKey (Abc)', puoi scrivere 'abc = forms.ModelChoiceField (queryset = Abc.objects.all(), required = False)' –

+1

Assicurati che i moduli siano importati se non lo stavi usando prima: 'from django import forms' –

5

Si dovrà aggiungere:

address = forms.CharField(required=False, blank=True, null=True) 
+3

Gli attributi vuoto e nullo non sono usati per ModelForms –

+2

questo dovrebbe essere nel campo _model_, non nel campo modulo. 'null = True, blank = True' farà sì che il campo ModelForm sia' required = False' – Anentropic

59
class My_Form(forms.ModelForm): 
    class Meta: 
     model = My_Class 
     fields = ('first_name', 'last_name' , 'address') 

    def __init__(self, *args, **kwargs): 
     super(My_Form, self).__init__(*args, **kwargs) 
     self.fields['address'].required = False 
+3

Anche se la risposta di akshar sembra migliore, questo metodo impedisce di fare cose per impostare cose come help_text ed etichetta. – Blackeagle52

+3

Questo metodo è particolarmente utile nell'affrontare i campi definiti come FK a livello di modello. Con il metodo di akshar, si dovrebbe impostare l'attributo 'queryset'. – PritishC

2

@ soluzione di Anentropic dal commento su @Atma's answer ha funzionato per me. E penso che sia anche il migliore.

Il suo commento:

nulla = True, vuoto = True farà sì che il campo ModelForm da richiedere = False

ho appena impostato sul mio campo ManyToMany nella mia classe UserProfile e ha funzionato perfettamente.

mia classe UserProfile ora assomiglia a questo (si noti il ​​campo friends):

class UserProfile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    friends = models.ManyToManyField('self', null=True, blank=True) 

penso anche che questa è la soluzione più bella da quando si fa la stessa cosa, mettere null e blank-True, tempo hai un semplice campo char o, come nel mio caso, il campo ManyToMany.

Ancora una volta, grazie mille @Anentropic. :)

P.S. Ho scritto questo post in quanto non ho potuto commentare (ho meno di 50 reputazione) ma anche perché penso che il suo commento abbia bisogno di più esposizione.

P.P.S. Se questa risposta ti ha aiutato, perfavore fai il suo commento.

Cheers :)

Problemi correlati