问题描述
我使用子窗体,验证工作正常.但是我想重写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无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!