[英]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.