Saya menggunakan subformulir dan validasi berfungsi dengan baik. Tetapi saya ingin mengganti error_messages, yang karena alasan tertentu tidak berfungsi saat menggunakan inlineformset_factory. Apa yang ingin saya capai adalah mengganti pesan kesalahan yang diperlukan dari formset.

Dokumentasi Django mengatakan:

error_messages adalah kamus nama bidang model yang dipetakan ke kamus pesan kesalahan.

Untuk alasan itu di inlineformset_factory saya melewati kamus sebagai berikut:

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',
    },
}
)

Anda juga dapat melihat file yang tersisa:

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())

form_produk.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 %}

Ketika saya melakukannya seperti itu bahkan pesan kesalahan Asal tidak muncul lagi. Berharap seseorang dapat membantu saya.

0
mbijou 24 November 2017, 19:19

1 menjawab

Jawaban Terbaik

Memecahkan masalah !

Kesalahan saya ada di views.py

Dalam fungsi form_valid dalam panggilan render dari blok else saya mendefinisikan ulang konteks daripada meneruskan konteks saat ini

Konteksnya tampaknya menyertakan informasi untuk menunjukkan pesan kesalahan yang diganti

Jadi kode yang dikoreksi akan terlihat seperti itu:

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)
1
mbijou 24 November 2017, 23:38