2009-07-15 129 views
64

我有一個表格,根據需要出現幾個字段,當我不需要它們時。下面是從models.py形式Django以模型形式需要字段

class CircuitForm(ModelForm): 
    class Meta: 
     model = Circuit 
     exclude = ('lastPaged',) 
    def __init__(self, *args, **kwargs): 
     super(CircuitForm, self).__init__(*args, **kwargs) 
     self.fields['begin'].widget = widgets.AdminSplitDateTime() 
     self.fields['end'].widget = widgets.AdminSplitDateTime() 

在實際電路模型中,字段的定義是這樣的:

begin = models.DateTimeField('Start Time', null=True, blank=True) 
end = models.DateTimeField('Stop Time', null=True, blank=True) 

我給這家views.py在這裏:

def addCircuitForm(request): 
    if request.method == 'POST': 
     form = CircuitForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/sla/all') 
    form = CircuitForm()  
    return render_to_response('sla/add.html', {'form': form}) 

我能做些什麼以便這兩個字段不是必需的?

+1

沒有辦法,這些領域成爲通過改變小部件所需。如果模型具有(null = True,blank = True),那麼modelForm將它呈現爲required = False。 – simplyharsh 2009-07-16 07:42:37

+0

看起來你是對的。字段本身不是必需的,但窗口小部件中的日期和時間字段是必需的。 – Ryan 2009-07-16 21:34:28

回答

102

如果你不想修改空白設置爲你的域模型內部(這樣做會破壞在管理網站正常驗證),你可以做你的窗體類以下內容:

def __init__(self, *args, **kwargs): 
    super(CircuitForm, self).__init__(*args, **kwargs) 

    for key in self.fields: 
     self.fields[key].required = False 

重新定義構造函數不會損害任何功能。

+0

謝謝!它並不接受`blank = True`和我的自定義小部件。 – osa 2014-09-14 03:00:27

16

如果模型字段爲空= True,則在表單字段中將required設置爲False。否則,需要=真

是這麼說的這裏:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

看起來你是對所做的一切。 您可以查看self.fields['end'].required的值。

+0

請注意,某些字段(例如`BooleanField`)在其構造函數(https://docs.djangoproject.com/en/dev/_modules/django/db/models/fields/#BooleanField)中具有空白=真硬編碼。所以,設置blank = False會默默地失敗。您必須在窗體的構造函數中使用`self.fields [...] .required = True`來強制這些字段所需的行爲。另見https://code.djangoproject.com/ticket/22282。 – 2018-02-17 18:14:35

3

這不是一個答案,但對於通過Google發現此問題的其他人來說,還有一點數據:這發生在帶有DateField的模型表單上。它需要設置爲False,模型具有「null = True,blank = True」,並且如果在clean()方法期間查看它,則表單中的字段顯示required = False,但它仍然說我需要一個有效的日期格式。即使當我明確地設置了input_formats = ['%Y-%m-%d','%m /%d /%Y','我沒有使用任何特殊的小部件,並且我得到了「輸入有效的日期」 %m /%d /%y','']在表單字段上。

編輯:不知道它是否會幫助其他人,但我解決了我遇到的問題。我們的表單在字段中有一些默認文本(在這種情況下,單詞「to」表示該字段是結束日期;該字段稱爲「end_time」)。我特意在表單的clean()方法中尋找單詞「to」(我也嘗試了clean_end_time()方法,但它從來沒有調用過),並將012_中建議的clean_data變量的值設置爲None。然而,這並不重要,因爲(我猜)該模型的驗證已經在無效日期格式「to」上嘔吐,而沒有給我一個截取它的機會。

+0

你解決了嗎? – Don 2015-03-06 08:32:09

3

擴展在DataGreed的回答,我創建了一個mixin,允許你指定一個fields_required變量Meta類是這樣的:

class MyForm(RequiredFieldsMixin, ModelForm): 

    class Meta: 
     model = MyModel 
     fields = ['field1', 'field2'] 
     fields_required = ['field1'] 

這裏它是:

class RequiredFieldsMixin(): 

    def __init__(self, *args, **kwargs): 

     super().__init__(*args, **kwargs) 

     fields_required = getattr(self.Meta, 'fields_required', None) 

     if fields_required: 
      for key in self.fields: 
       if key not in fields_required: 
        self.fields[key].required = False 
0

model field documentation

如果你有一個模型,如下圖所示,

class Article(models.Model): 
    headline = models.CharField(
     max_length=200, 
     null=True, 
     blank=True, 
     help_text='Use puns liberally', 
    ) 
    content = models.TextField() 

您可以在廣告標題的表單驗證改爲required=True而不是blank=False作爲模型如下所示定義字段。

class ArticleForm(ModelForm): 
    headline = MyFormField(
     max_length=200, 
     required=False, 
     help_text='Use puns liberally', 
    ) 

    class Meta: 
     model = Article 
     fields = ['headline', 'content'] 

所以回答這個問題,

class CircuitForm(ModelForm): 
    begin = forms.DateTimeField(required=False) 
    end = forms.DateTimeField(required=False) 
     class Meta: 
      model = Circuit 
      exclude = ('lastPaged',) 

這使得beginendrequired=False