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

Posted

技术标签:

【中文标题】Django:模板中的 Crispy 表单验证错误【英文标题】:Django: Crispy Forms Validation Error in Template 【发布时间】:2021-02-11 07:43:10 【问题描述】:

我正在使用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】:

您可以使用|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 相同的方式呈现仅表单错误

【讨论】:

以上是关于Django:模板中的 Crispy 表单验证错误的主要内容,如果未能解决你的问题,请参考以下文章

使用内联表单在 django-crispy-forms 中呈现字段错误

如何使用 Ajax 渲染 django-crispy-forms 的验证错误?

在 django-crispy 按钮名称中使用 django 模板变量

在 python 中通过 django-crispy-forms 渲染表单

Django Crispy 表单 - 更新视图的内联表单集“ManagementForm 数据”错误

Django Crispy 表单拆分字段布局