本文介绍了Django inlineformset_factory error_messages无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用子窗体,验证工作正常.但是我想重写error_messages,由于使用inlineformset_factory时,由于某些原因它不起作用.我要实现的是重写所需的表单集错误消息.

I use a subform and validation works fine. But I want to override the error_messages, which for some reason doesn't work when using inlineformset_factory. What I want to achieve is overriding the required error message of the formset.

django文档说:

The django documentation says:

error_messages 模型字段名称的字典,映射到错误消息的 dictionary .

error_messages is a dictionary of model field names mapped to a dictionary of error messages.

由于这个原因,我在inlineformset_factory中传递了一个字典,如下所示:

For that reason in inlineformset_factory I passed a dictionary as following:

forms.py:

from django import forms
from .models import Product
from brand.models import Brand
from masterdata.models import Masterdata
from django.forms.models import inlineformset_factory

Master_Inlineformset = inlineformset_factory(
Product,
Masterdata,
fields=('title', 'description', 'mpn', 'brand_id', 'categories'),
extra=1, can_delete=False,
labels={'title': 'Title', 'description': 'Description',
       'mpn': 'Articlenumber', 'brand_id': 'Brand',
       'categories': 'Categories'},
error_messages = {   
    'brand_id': {
        'required': 'some custom required message',
    },
}
)

您还可以查看其余文件:

You can also have a look on the remaining files:

views.py:

class ProductUpdateView(LoginRequiredMixin, UpdateView):
    form_class = ProductCreateForm
    template_name = "artikel/product_form.html"

    def get_queryset(self):
        queryset = Product.objects.filter(pk=self.kwargs.get("pk"))
        return queryset

    def get_context_data(self, *args, **kwargs):
        context = super(ProductUpdateView, self).get_context_data(*args, **kwargs)

        if self.request.POST:
            formset = Master_Inlineformset(self.request.POST, self.request.FILES, instance=self.object)
        else:
            formset = Master_Inlineformset(instance=self.object)

        context["formset"] = formset

        return context

    def form_valid(self, form, **kwargs):
        self.object = form.save()
        context = self.get_context_data(**kwargs)
        formset = context["formset"]

        if formset.is_valid():
            formset.save()
        else:
            return render(self.request, self.template_name, {"form": self.form_class(self.request.POST), "formset": formset,})
    return HttpResponseRedirect(self.get_success_url())

product_form.html:

{{formset.management_form }}
{{formset.errors}}
{% for f in formset %}
{% for hidden in f.hidden_fields %}
{{hidden}}
{% endfor %}
{% for field in f.visible_fields%}
{% for error in field.errors %}
<div style="color:red">{{error}}</div>
{% endfor %}
<p>{{field.label_tag}}</p>
<p>{{field}}</p>
{% endfor %}
{% endfor %}

当我这样做时,甚至不再出现原点错误消息.希望有人能帮助我.

When I do it that way even the origin error message doesn't appear anymore. Hope someone can help me out.

推荐答案

解决了问题!

我的错误是在views.py

my mistake was in views.py

在else块的渲染调用的form_valid函数中,我重新定义了上下文,而不是传递当前上下文

in the form_valid function in the render call of the else block I redefined the context rather than passing the current context

上下文似乎包含显示覆盖的错误消息的信息

the context seems to include the information to show the overriden error messages

因此更正后的代码应如下所示:

so the corrected code should look like that:

def form_valid(self, form, **kwargs):
    self.object = form.save()
    context = self.get_context_data(**kwargs)
    formset = context["formset"]

    if formset.is_valid():
        formset.save()
    else:
        return render(self.request, self.template_name, context)

这篇关于Django inlineformset_factory error_messages无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-21 05:02