2013-04-25 88 views
40

我有一個這樣的形式:的Django的ModelForm不必填字段

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

我怎樣才能把可選地址字段?

+1

模型是什麼樣的? – Ngenator 2013-04-25 04:08:56

回答

43

猜猜你的模型是這樣的:

class My_Class(models.Model): 

    address = models.CharField() 

您的形式:

class My_Form(ModelForm): 

    address = forms.CharField(required=False) 

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

外鍵字段呢? – digz6666 2013-10-17 04:14:36

+10

使用ModelChoiceField。因此,如果字段定義是'abc = models.ForeignKey(Abc)',您可以編寫'abc = forms.ModelChoiceField(queryset = Abc.objects.all(),required = False)' – 2013-10-17 09:33:24

+1

確保表單被導入if您以前沒有使用過它:'from django import forms' – 2013-10-30 04:11:03

5

你將不得不補充:

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

空白和空屬性不用於ModelForms – 2015-06-15 04:23:34

+2

,它應該位於_model_字段中,而不是表單字段。 'null = True,blank = True'將導致ModelForm字段爲'required = False' – Anentropic 2017-03-23 17:29:15

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

儘管akshar的答案看起來更好,但此方法可以防止您必須執行設置help_text和label之類的內容。 – Blackeagle52 2015-11-24 09:39:37

+3

該方法在處理在模型級別定義爲FK的字段時特別有用。按照akshar的方法,人們必須設置'queryset'屬性。 – PritishC 2016-01-22 09:55:17

2

@從註釋Anentropic的解決方案在@Atma's answer工作我。我認爲這也是最好的。

他的評論:

空=真,空=真會導致的ModelForm領域需要=假

我只是把它放在我的多對多場在我UserProfile類,它完美無缺地工作。

UserProfile類現在看起來是這樣的(注意friends場):

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

我也認爲這是最漂亮的解決方案,因爲你做同樣的事情,把nullblankTrue,天氣你有一個簡單的char字段,或者像我一樣,ManyToMany字段。

再一次,非常感謝@Antropic。 :)

P.S. 我之所以寫這篇文章是因爲我無法評論(我的聲望不到50),也是因爲我認爲他的評論需要更多的曝光。

P.P.S. 如果這個答案對你有幫助,請做出鼓勵他的評論。

Cheers :)