Django模型表单中的必填字段

19 浏览
0 Comments

Django模型表单中的必填字段

我有一个表格,其中有一些字段在我不希望它们是必填项的情况下被标记为必填项。以下是来自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()

在实际的Circuit模型中,字段定义如下:

begin = models.DateTimeField('开始时间', null=True, blank=True)
end = models.DateTimeField('结束时间', 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})

我该怎么做,使这两个字段不再是必填项?

0
0 Comments

Django中的ModelForm是一个方便的工具,用于根据模型自动生成表单。在使用ModelForm时,有时候我们可能会遇到一个问题,即在模型字段设置了blank=False时,表单字段却仍然被设置为非必填字段。

根据上述引用的内容,我们可以了解到,如果模型字段设置了blank=True,则表单字段的required属性将被设置为False,否则required属性将被设置为True。这意味着,如果我们在模型字段中设置了blank=False,但表单字段仍然显示为非必填字段,那么可能是因为我们没有正确设置required属性。

为了解决这个问题,我们可以通过检查self.fields['end'].required属性来验证其值。如果该属性的值为False,那么我们可以手动将其设置为True,以强制要求用户填写该字段。需要注意的是,某些字段(如BooleanField)在其构造函数中硬编码了blank=True的设置,所以设置blank=False将会静默失败。对于这些字段,我们需要在表单的构造函数中使用self.fields[…].required = True来强制设置required属性,以达到我们想要的必填字段的行为。

总结起来,如果我们在使用Django的ModelForm时发现模型字段的设置并没有正确地传递到表单字段中,我们可以通过手动设置表单字段的required属性来解决这个问题。

0
0 Comments

Django模型表单(Model Form)中,有时候需要指定某些字段为必填字段。下面的内容提供了一个可以在Meta类中指定必填字段的Mixin方法。代码如下:

class MyForm(RequiredFieldsMixin, ModelForm):
    class Meta:
        model = MyModel
        fields = ['field1', 'field2']
        fields_required = ['field1']

其中,`fields_required`是在Meta类中指定的必填字段列表。

下面是这个Mixin方法的具体实现:

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

这个Mixin方法在初始化表单时,会检查是否存在`fields_required`,如果存在,则将除了`fields_required`中指定的字段之外的其他字段设置为非必填字段。

如果使用这个Mixin方法的用户也重写了`__init__`方法,那么Mixin方法还会起作用吗?多重继承的解析顺序是怎样的?

当重写`__init__`方法时,应该始终调用`super()`方法,就像在上面的代码中所做的那样。这样,会先调用Mixin的`__init__`方法,然后再调用用户重写的`__init__`方法。

如果有其他资源讨论这个问题,也可以创建一个新的问题来讨论。请确保在这个问题中保持评论的主题一致。

0
0 Comments

问题出现的原因是在Django中的模型表单中,如果某个字段没有设置为必填项(即blank=True),那么在表单中提交时会报错,提示该字段为必填项。

解决方法是在表单的构造函数中重新定义字段的required属性为False,这样就可以绕过该字段的必填项验证。

具体代码如下:

def __init__(self, *args, **kwargs):
    super(CircuitForm, self).__init__(*args, **kwargs)
    for key in self.fields:
        self.fields[key].required = False 

这样重新定义的构造函数不会影响任何功能,同时可以解决字段必填项的问题。

0