在模板中自定义django表单时验证失败

时间:2014-01-01 05:07:30

标签: django validation django-forms django-templates

我制作了一个django表单,其中包含两个字段的开始日期和结束日期,并制作了一个formset。当我在模板中使用formset作为

{{ myformset.management_form }}

{% for form in myformset %}
<p>For period {{ forloop.counter }}</p>
{{ form.as_table }}
<br/>
{% endfor %}
<input  type = "submit"  value = "See Results" id = "daterangeresult">

我在两个不同的行中得到了这两个字段的表单。对于多种形式,看起来并不好看,因为所有字段都在不同的行中。然后我改为使这两个字段显示在一行中,如下所示

{{ myformset.management_form }}
{% for form in myformset %}
<p>For period {{ forloop.counter }}</p>
<table>
<tr>
<td>Start Date {{form.start_date}}</td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td>End Date {{form.end_date}}</td>
</tr>
</table>
<br/>
{% endfor %}
<input  type = "submit"  value = "See Results" id = "daterangeresult">

然后,此formset无法验证我已验证的表单字段 的 forms.py

from django import forms
from functools import partial
from datetime import date
DateInput = partial(forms.DateInput, {'class': 'dateinput'})

class DateRangeForm(forms.Form):
    start_date = forms.DateField(widget=DateInput())
    end_date = forms.DateField(widget=DateInput())

    def clean(self):
        if (self.cleaned_data.get('start_date') >= self.cleaned_data.get('end_date')):
            raise forms.ValidationError( 'Start date must be less than end date')
        elif(self.cleaned_data.get('start_date') > date.today() or self.cleaned_data.get('end_date') > date.today()):
            raise forms.ValidationError('Date can not be greater than today')
        else:
            return self.cleaned_data

如何同时获取表格字段验证和模板中表单的自定义显示两件事?

1 个答案:

答案 0 :(得分:1)

首先,我建议更新表单定义以包含标签和help_text。我不知道您使用的是哪个版本,但这里是一个很好的起点:https://docs.djangoproject.com/en/1.6/topics/forms/

然后,在模板中,只要您想将这些内容放入表单,就可以{{ form.start_date.label_tag }}{{ form.start_date }}{{ form.start_date.help_text }}

其次,对于验证问题,您可以覆盖clean_ fieldname ,而不是覆盖clean。在您的情况下clean_start_dateclean_end_date。一旦你有那些设置可以做

def clean_end_date(self):
    start = self.cleaned_data['start_date'] 
    end = self.cleaned_data['end_date'] 

    if start > end:
        ...do stuff...