【问题标题】:Django: If I call is_valid() on a form do I still have to clean the data in forms.py?Django:如果我在表单上调用 is_valid(),我还需要清理 forms.py 中的数据吗?
【发布时间】:2015-07-29 18:46:17
【问题描述】:

如果我在表单上调用is_valid(),我还需要清理forms.py 中的数据吗?我觉得它是多余的。我知道is_valid()是假设自动运行clean(),那么框架为什么会让用户使用forms.py中的clean()函数呢?

forms.py

from django.core.validators import RegexValidator
my_validator = RegexValidator("\d{6}\-\d{2}", "CAPA format needs to be ######-##.")

class IncidentSearchForm(forms.Form):

    id = forms.IntegerField(required=False)
    user_id = forms.ModelChoiceField(User.objects.all(), required=False) 
    capa = forms.CharField(
        label="CAPA",
        required=False,
        validators=[my_validator]
        )

    def search(self):

        id = self.cleaned_data.get('id')
        user_id = self.cleaned_data.get('user_id')
        capa = self.cleaned_data.get('capa', None)

        if id is not None:
            query = query.filter(id=id))
        if user_id is not None:
            query = query.filter(user_id=user_id)
        if capa is not '':
            query = query.filter(capa=capa)

        return(query)

view.py

@login_required(login_url='/login/')
def index(request):

    template = "index.html"
    form = IncidentSearchForm(request.GET) # or None
    incident_list = None

    if form.is_valid():
        incident_list = form.search()
        context = { "form": form,                       
                    "incident_list": incident_list}
        return render(request, template, context)

    else:
        # form is empty show all OPEN incidents
        form = IncidentSearchForm()
        incident_list = Incident.objects.filter(open = 'True').order_by('-incident_date_time_reported')
        context = { "form": form,
                    "incident_list": incident_list}
        return render(request, template, context)

【问题讨论】:

  • 您不需要在表单上调用 clean。就像你说的,当你调用 .is_valid() 时它会这样做。如果要执行任何自定义验证,则调用/覆盖 clean
  • 好的,那么我在上面的代码中做了什么不必要或多余的事情吗?我一直觉得self.cleaned_data.get 是多余的,因为我在views.py 中调用is_valid()。我开始明白了。我会覆盖 capa 的清理
  • self.cleaned_data.get 在 is_valid 调用 clean 后得到结果。

标签: django forms validation


【解决方案1】:

is_valid() 检查表单的errors 属性(假设它尚未运行)调用full_clean(),后者调用_clean_form(),后者调用clean(),因此无需直接调用该方法。

感觉 self.cleaned_data.get 是多余的,因为我在 views.py 中调用 is_valid()

我不能 100% 确定您的反对意见,但请注意,除非 clean() 成功完成,否则 cleaned_data 将为空,因此您的 search 函数在没有检查的情况下将无法正常工作。您是正确的,您不需要在任何必填字段中使用get,但由于您没有必填字段,所以它仍然是一个更好的选择。

【讨论】:

    猜你喜欢
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2011-10-16
    相关资源
    最近更新 更多