【问题标题】:Django Form Template ErrorsDjango 表单模板错误
【发布时间】:2012-01-09 19:32:30
【问题描述】:

我给自己写了一个表格:

class Autopoweroff_Form(forms.Form):
    autopoweroff_groups = forms.CharField(required=True)
    autopoweroff_groups_hosts = forms.CharField(required=True)
    autopoweroff_groups_start = forms.CharField(required=True)
    autopoweroff_groups_end = forms.CharField(required=True)
    autopoweroff_groups_startup_delay = forms.CharField(required=True)
    autopoweroff_groups_idle_time = forms.CharField(required=True)

现在我知道我不必明确设置 reuqired=True 但请暂时忍受。 无论如何,让我们继续前进。

现在因为我讨厌在视图中进行验证等操作,所以我只为该表单定义了一个更新函数:

    def update(self, data):
        if not self.is_bound and data is not None:
            raise Exception()

        if self.is_valid():
            curr_group = self.cleaned_data['autopoweroff_groups']
            ...

然后在我看来这样称呼它:

if request.method == 'POST':
        form = Autopoweroff_Form(data=request.POST)
        form.update(data=request.POST)
        return HttpResponseRedirect('/admin/thin/create_autopoweroff')
    else:
        form = Autopoweroff_Form()

    ...

现在的问题是,如果我没有在表单中输入任何内容,表单将按原样返回,而不会显示任何应有的错误。我也知道它不会做任何事情,因为:

https://docs.djangoproject.com/en/1.3/ref/forms/validation/

事实上,如果表单中有任何错误,Django 目前会彻底清除cleaned_data 字典。但是,这种行为将来可能会发生变化,因此首先要自己清理干净并不是一个坏主意。

如果我尝试:

def update(self, data):
        if not self.is_bound and data is not None:
            raise Exception()

        if self.is_valid():
            curr_group = self.cleaned_data['autopoweroff_groups']
            ...
        else:
            print self.errors

我得到了我希望在模板中看到的错误。 我也试过了:

def clean_autopoweroff_groups(self):
        autopoweoff_groups = self.cleaned_data.get('autopoweroff_groups', "")
        if autopoweoff_groups == '':
            print "Validation Error"
            raise forms.ValidationError('Please Enter A Name')
        return autopoweroff_groups

我到底做错了什么?

更新: 在我看来:

    if request.method == 'POST':
        form = Autopoweroff_Form(data=request.POST)

        if form.is_valid():
            form.update(data=request.POST)
            return HttpResponseRedirect('/admin/thin/create_autopoweroff')
    else:
        form = Autopoweroff_Form()

并在我的表单中删除 if self.is_valid()

【问题讨论】:

    标签: django forms templates


    【解决方案1】:

    Django 已内置验证,因此您无需重写它:

    class Autopoweroff_Form(forms.Form):
        # I suggest not prefixing your fields with the name of the class
        groups = forms.CharField(required=True)
        hosts = forms.CharField(required=True)
        start = forms.CharField(required=True)
        end = forms.CharField(required=True)
        delay = forms.CharField(required=True)
        idle_time = forms.CharField(required=True)
    

    在你看来:

    if request.method == 'POST':
        form = Autopoweroff_Form(data=request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/admin/thin/create_autopoweroff')
    else:
        form = Autopoweroff_Form()
    

    请注意,您在视图中调用 is_valid(),而不是在表单中。

    如果您想对单个字段或一组字段执行更复杂的验证,您可以覆盖表单clean()clean_[field_name]() 方法。

    看这里:

    https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2020-03-13
      • 2011-05-28
      • 2021-02-11
      • 2016-03-09
      • 2011-11-08
      • 2011-02-01
      • 2020-03-20
      相关资源
      最近更新 更多