Django:如何检查用户是否将所有字段留空(或为初始值)?

20 投票
5 回答
14439 浏览
提问于 2025-04-16 09:15

我知道 is_valid() 这个函数会检查一个表单里所有必填的数据是否都填写了。但我想要的并不是这个。我想检查的是表单里是否有任何字段被填写过。

有没有什么好主意呢?

进一步说明:

我想让用户可以选择完全不填写这个表单。不过,如果他们尝试填写(也就是说:把某个字段的值从最初的状态——通常是空值——改成其他值),我就想对这些填写的内容进行验证。

这个表单的样子大概是这样的:

def get_opinion(request):

    if request.method == 'POST':
        f = OpinionForm(request.POST)
        if form_is_blank(f):
            return HttpResponseRedirect(reverse('thank_you_anyway'))
        elif f.is_valid():
            #Process here
            return HttpResponseRedirect(reverse('thanks_for_participating'))
    else:
        initial = {'weekday': date.today().strftime('%A')}
        f = OpinionForm(initial=initial)

    return render_to_response(
        'get_opinion.html',
        {'form': f,},
        RequestContext(request)
    )

我想要的就是 form_is_blank() 这个部分。

5 个回答

3

你应该把表单中的所有字段的必填选项设置为False,也就是不强制填写。然后重写一下clean方法,来进行自定义的验证。想了解更多,可以查看官方文档

4

为了让这个功能在实际的<form>标签中只对某些表单起作用,你还需要定义

class YourForm(forms.ModelForm):
    def full_clean(self):
        if not self.has_changed():
            self._errors = ErrorDict()
            return

        return super(YourForm, self).full_clean()

这样,当用户被提示去修正验证错误时,就不会显示那些你只想在某些值不为空(或者是默认值)时才进行验证的表单的错误。

30

看来我得自己回答自己的问题了。

显然,有一个没有文档说明的 Form 函数:has_changed()

>>> f = MyForm({})
>>> f.has_changed()
False
>>> f = MyForm({'name': 'test'})
>>> f.has_changed()
True
>>> f = MyForm({'name': 'test'}, initial={'name': 'test'})
>>> f.has_changed()
False

所以这个函数可以很好地替代 form_is_blank()(当然是要恢复原样的)。

撰写回答