@lunrox

Как в Django создать несколько форм на одной странице?

Здравствуйте. У меня возникла проблема с выводом нескольких форм на одну страницу в Django-проекте.
У меня есть продукт, который нужно отобразить на странице с помощью DetailView и на этой же странице должны быть две формы, позволяющие создать два разный объекта.
Пока у меня вот что получилось, но не работает:
Views.py:
class ProductDetails(DetailView, CreateView):

    model = Product
    template_name = 'product/product_detail.html'
    form_class = PhoneCompanyMessageForm
    second_form_class = TextCompanyMessageForm
    success_url = '/'
    mess_type = True #if true, then Text, else Phone message

    def get_queryset(self):
        qs = super(ProductDetails, self).get_queryset()
        return qs.select_related("categories")

    def get_context_data(self, **kwargs):
        context = super(ProductDetails, self).get_context_data(**kwargs)
        if 'form' not in context:
            context['form'] = self.form_class()
        if 'form2' not in context:
            context['form2'] = self.second_form_class()
        return context

    def form_invalid(self, **kwargs):
        return self.render_to_response(self.get_context_data(**kwargs))

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        if 'form' in request.POST:
            form_class = self.get_form_class()
            form_name = 'form'
        else:
            form_class = self.second_form_class
            form_name = 'form2'
            self.mess_type = False

        form = self.get_form(form_class)

        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(**{form_name: form})

    def form_valid(self, form):
        instance = form.save(commit=False)
        instance.company = self.object.company
        instance.product = self.object
        instance.mess_type = self.mess_type
        instance.save()
        return HttpResponseRedirect('/')

forms.py:
class PhoneCompanyMessageForm(forms.ModelForm):
    class Meta:
        model = ProductCompanyMessage
        fields = ['sender_name',
                  'phone',
                  ]

    def __init__(self, *args, **kwargs):
        super(PhoneCompanyMessageForm, self).__init__(*args, **kwargs)
        for key in self.fields:
            self.fields[key].required = True

class TextCompanyMessageForm(forms.ModelForm):
    class Meta:
        model = ProductCompanyMessage
        fields = ['sender_name',
                  'text',
                  'email',
                  ]

    def __init__(self, *args, **kwargs):
        super(TextCompanyMessageForm, self).__init__(*args, **kwargs)
        for key in self.fields:
            self.fields[key].required = True

template:
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" name="form" value="Submit" />
</form>

<form method="post">
    {% csrf_token %}
    {{ form2.as_p }}
    <input type="submit" name="form2" value="Submit" />
</form>

Продукт отображается, при нажатии сабмитов на формах делается редирект на страницу без содержимого. страница /products/, хотя все редиректы ведут к '/'

Используется версия Django 1.6
Заранее спасибо.
  • Вопрос задан
  • 8728 просмотров
Пригласить эксперта
Ответы на вопрос 2
alternativshik
@alternativshik
первое, что бросилось в глаза - формы умеют параметр prefix как раз для случаев, когда надо несколько форм на 1 странице.
def form_invalid(self, **kwargs):
return self.render_to_response(self.get_context_data(**kwargs))

видимо, отсюда и проблема. Форма невалидна?
Ответ написан
@silentboy13
Используйте formset для вывода нескольких форм https://docs.djangoproject.com/en/1.6/topics/forms...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы