один шаблон - несколько ошибок в моделях

views.py

def fadded(request):
    if request.method == "POST":
        fform = FtForm(request.POST)
        bform = BgForm(request.POST)
        if fform.is_valid() and bform.is_valid():
            bcontent=bform.save()
            fcontent=fform.save()

        else:
            return render_to_response("ft.html", {
            "fform": fform,
            "bform": bform,
            },context_instance=RequestContext(request))
    return HttpResponse('OK!')

ft.html

...
    {% if form.errors%}
    
    {% for error in form.errors %} {{ error|escape }} {% endfor %}
{% endif %} ...

Существует две формы модели: fform и bform. Они представляют две разные модели, но используются в одном шаблоне. Я пытаюсь сохранить и то, и другое, и получить ошибки формы / поля от обоих. Но если уже есть fform.errors, django не показывает bform.errors (и, вероятно, даже не создает bform). Есть предложения по другому пути?


person Alex B.    schedule 14.03.2011    source источник


Ответы (2)


django не показывает bform.errors (и, вероятно, даже не создает bform)

Учитывая вашу настройку, обе формы передают данные и готовы к проверке. Не должно быть проблем.

В вашем шаблоне вам нужно будет отображать ошибки обеих форм (я вижу, что в вашем шаблоне проверяется только одна форма)

{{ fform.errors }} <!-- show errors from fform -->
{{ bform.errors }} <!-- show errors from bform -->
person Yuji 'Tomita' Tomita    schedule 14.03.2011

Вам необходимо использовать представления на основе классов!

Вот быстрый пример использования нескольких форм в одном представлении Django.

из django.contrib импортировать сообщения из django.views.generic импортировать TemplateView

из .forms импортировать AddPostForm, AddCommentForm из .models import Комментарий

class AddCommentView(TemplateView):

    post_form_class = AddPostForm
    comment_form_class = AddCommentForm
    template_name = 'blog/post.html'

    def post(self, request):
        post_data = request.POST or None
        post_form = self.post_form_class(post_data, prefix='post')
        comment_form = self.comment_form_class(post_data, prefix='comment')

        context = self.get_context_data(post_form=post_form,
                                        comment_form=comment_form)

        if post_form.is_valid():
            self.form_save(post_form)
        if comment_form.is_valid():
            self.form_save(comment_form)

        return self.render_to_response(context)     

    def form_save(self, form):
        obj = form.save()
        messages.success(self.request, "{} saved successfully".format(obj))
        return obj

    def get(self, request, *args, **kwargs):
        return self.post(request, *args, **kwargs)

В этом примере я нашел в Интернете (в руководстве по RIP ), мы используем ШАБЛОННЫЙ ВИД. Представления на основе классов - ваш способ обойти это. Вот ссылка на самую последнюю документацию о том, как использовать представления на основе классов в Django. Приятного чтения и, прежде всего, терпения. https://docs.djangoproject.com/en/2.2/topics/class-based-views/

Надеюсь, это поможет вам в правильном направлении. С нетерпением жду ответа, как все пойдет.

person Martin Castellon    schedule 24.08.2019