Django:模板中的 Crispy Forms 验证错误

Django: Crispy Forms Validation Error in Template

我正在使用 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 很好地呈现与表单相关的验证错误吗? 与字段相关的错误显示得很好。

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

<form method="post">
    {% csrf_token %}
    {{ form<b>|as_crispy_errors</b> }}
    <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>

此模板过滤器将:

Renders only form errors the same way as django-crispy-forms.