模型形式的Django必选字段

2024-05-13 22:04:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表单,当我不需要的时候,有几个字段会按要求显示出来。这是models.py的表单

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})

我该怎么做才能不需要这两个字段?


Tags: pyselfformtrue表单fieldsinitmodels
3条回答

If the model field has blank=True, then required is set to False on the form field. Otherwise, required=True

这里这么说:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

看起来你做得很好。 您可以检查self.fields['end'].required的值。

扩展DataGreed的答案,我创建了一个Mixin,允许您在Meta类上指定一个fields_required变量,如下所示:

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

如果不想修改模型中字段的空白设置(这样做将破坏管理站点中的正常验证),可以在窗体类中执行以下操作:

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

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

重新定义的构造函数不会损害任何功能。

相关问题 更多 >