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

Posted

技术标签:

【中文标题】使用内联表单在 django-crispy-forms 中呈现字段错误【英文标题】:Rendering field errors in django-crispy-forms with inline forms 【发布时间】:2013-10-06 08:39:35 【问题描述】:

我在 django_crispy_forms 中使用 bootstrap3 作为默认模板包,并尝试使用脆标签呈现表单:

% crispy form %

我的表单类有以下辅助属性:

class TheForm(forms.Form):
    adv_var = forms.CharField(label="variable", max_length=70)
    value = forms.FloatField()

    def __init__(self, *args, **kwargs):
        super(TheForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()

        self.helper.form_method = 'post'
        self.helper.form_class = 'form-inline'
        self.helper.field_template = 'bootstrap3/layout/inline_field.html'

        self.helper.layout = Layout(
            'adv_var', 'value',
            ButtonHolder(
                Submit('submit', 'Start', css_class='button white')
            )
        )

当发布有错误的表单时,即使我可以在视图中打印 form._errors 并查看错误列表,重新渲染模板也不会显示错误。

如果我将 helper.field_template 更改为另一个值(或将其删除以设置默认值),错误将显示在每个字段上方 - 但我不再获得内联显示。

例如,我如何使用 django-crispy-forms 在单独的 div 中显示此表单的所有错误?

【问题讨论】:

我也遇到了同样的问题,你找到解决办法了吗? 同样的问题。更新将不胜感激。 这可能是一个解决方案。 ***.com/questions/13287883/… 【参考方案1】:

您可能需要考虑使用FormView 通用视图,尤其是在您使用脆表单时:

app/views.py:

from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from .forms import MyForm

class MyFormView(FormView):
    template_name = 'app/myform.html'
    form_class = MyForm
    success_url = reverse_lazy('success_url')

app/templates/app/myform.html:

% load crispy_forms_tags %
% crispy form %

【讨论】:

【参考方案2】:

也许更简单的方法是下一个,因为它使用较少的导入......

.. 在视图中:

if request.method == 'POST':
    form = TheForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('url_name')
    else:
        form = TheForm()
    return render(request, 'form.html', 'form': form)

...并以您只需要的形式:

% load crispy_forms_tags %
% crispy form %

...其中 'url_name' 是 urlpatterns (urls.py) 中定义的模式名称...这就是您真正需要的...

Crispy 是一个非常智能的系统。系统知道如何直观地显示表单错误。

【讨论】:

【参考方案3】:

当表单出现验证错误时,我们使用 django.contrib.messages 推送通用错误字符串,并将字段错误单独保留以内联呈现:

from django.contrib import messages
# ...
if not form.is_valid():
    messages.error(request, "Please correct the errors below and resubmit.")
    return render(request, template, context)

然后我们使用引导警报来显示所有消息,包括我们的一般错误,尽管您当然可以随意标记它。

但是,如果您只想将错误移到单独的块中,请将它们添加到您的请求上下文中:

from django.contrib import messages
# ...
if not form.is_valid():
    context['form_errors'] = form.errors
    return render(request, template, context)

在您的模板中:

% crispy form %
<div id='form-errors'> form_errors </div>

然后您可以使用 crispy form's helper attributes 和样式来控制内联错误的显示。

【讨论】:

以上是关于使用内联表单在 django-crispy-forms 中呈现字段错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从 django 中的内联表单接收上传的文件?

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

最初在 django 内联表单集中设置不同的外键值

一行内联表单,输入字段上方有标签

Twitter Bootstrap 内联表单间距

Django 内联表单集将始终创建新对象而不是更新它们