简体   繁体   English

Django inlineformset_factory error_messages无法正常工作

[英]django inlineformset_factory error_messages not working

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. 但是我想重写error_messages,由于使用inlineformset_factory时由于某些原因,该信息不起作用。 What I want to achieve is overriding the required error message of the formset. 我要实现的是重写所需的表单集错误消息。

The django documentation says: django文档说:

error_messages is a dictionary of model field names mapped to a dictionary of error messages. error_messages模型字段名称字典 ,映射到错误消息的字典

For that reason in inlineformset_factory I passed a dictionary as following: 由于这个原因,我在inlineformset_factory中传递了一个字典,如下所示:

forms.py: 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: 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: 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. 希望有人可以帮助我。

Solved the problem ! 解决了问题!

my mistake was in views.py 我的错误是在views.py

in the form_valid function in the render call of the else block I redefined the context rather than passing the current context 在else块的渲染调用的form_valid函数中,我重新定义了上下文,而不是传递当前上下文

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM