Django:模板中的脆皮表单验证错误

时间:2020-10-28 21:13:45

标签: django django-forms django-templates django-crispy-forms django-validation

我正在将django-crispy-forms用于呈现效果很好的表格。 对于我的一种表单,我不得不进行一些自定义调整,现在想知道如何正确地验证不属于特定字段而是整个表单的错误。

具体地说,我的表单包含开始日期和结束日期:

# forms.py 
class PlotForm(forms.Form):
    start_date = forms.DateField(initial=last_month, widget=forms.widgets.DateInput(attrs={'type': 'date'}))
    end_date = forms.DateField(initial=datetime.date.today, widget=forms.widgets.DateInput(attrs={'type': 'date'}))

    def clean(self):
        cleaned_data = super().clean()
        start_date = cleaned_data.get('start_date')
        end_date = cleaned_data.get('end_date')
        if start_date > end_date:
            raise forms.ValidationError("Start date must not be before end date.")
        return start_date

要检查结束日期是否早于开始日期,我使用clean(self)

但是,错误永远不会显示。

<form method="post">
        {% csrf_token %}
        <div class="row">
            <div class="col-6">
                {{ form.start_date|as_crispy_field }}
            </div>
            <div class="col-6">
                {{ form.end_date|as_crispy_field }}
            </div>
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>

我可以通过添加{{ form.errors }}来解决此问题,但这看起来确实很丑。有没有一种简单的方法可以很好地呈现与crispy相关的表单相关的验证错误? 与字段相关的错误显示得很好。

1 个答案:

答案 0 :(得分:1)

您可以使用|as_crispy_errors template filters [readthedocs]

<form method="post">
    {% csrf_token %}
    {{ form|as_crispy_errors }}
    <div class="row">
        <div class="col-6">
            {{ form.start_date|as_crispy_field }}
        </div>
        <div class="col-6">
            {{ form.end_date|as_crispy_field }}
        </div>
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

此模板过滤器将:

仅以django-crispy-forms的方式呈现仅形成错误

相关问题