Как использовать несколько форм с формой мастера форм в одном шаблоне (Django)

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

Когда у меня есть URL-адрес с postid (?P\d+) -url, размещенный перед ContactWizard.as_view -urls, отображаются формы в представлении - функция one_labeling, но не Form Wizard/ContactWizard.as_view в классах views.py ContactWizard( SessionWizardView)

url(r'^label$', LabelingIndex),
url(r'^label(?P<postID>\d+)$',one_labeling),# <----- here
url(r'^label',ContactWizard.as_view([Form1, Form2, Form3])),
url(r'^label(?P<one_labeling>\d+)/$', 'formwizard.views.one_labeling'),

и наоборот, когда URL-адрес Мастера форм помещается перед postID - URL-адрес форм в функции представления one_labeling, тогда FormWizard отображается (и работает), но другие формы не отображаются/не вызываются.

url(r'^label$', LabelingIndex),
url(r'^label',ContactWizard.as_view([Form1,Form2, Form3])),          
url(r'^label(?P<one_labeling>\d+)/$', 'formwizard.views.one_labeling'),
url(r'^label(?P<postID>\d+)$',one_labeling), #<----- here

Я не знаю, как добавить префикс формы мастера, чтобы использовать ее как {{ form9.as_p }}, например {{ form3.as_p }} вместо {{ form1 }}{{ wizard.management_form }} или {{ form }} в файле done.html ниже, чтобы он работал одновременно с другими формами в шаблоне one_labeling_index.html.

в шаблоне done.html

{% extends 'base_one_labeling.html' %}

{% block content %}

   {% for form in form_data %}

       {{ form }}

   {% endfor %}

{% endblock %}

в представлениях.py

class ContactWizard(SessionWizardView):

    template_name = "one_labeling_index.html"

    def done(self, form_list, **kwargs):


        form_data = process_form_data(form_list)

        return render_to_response("done.html",{"form_data":form_data})
def process_form_data(form_list):
    form_data = [form.cleaned_data for form in form_list]

    logr.debug(form_data[0]['subject'])
    logr.debug(form_data[1]['sender'])
    logr.debug(form_data[2]['message'])

    send_mail(form_data[0]['subject'],form_data[1]['sender'],
              form_data[2]['message'], '[email protected]',
              fail_silently=False)

    return form_data

в views.py,LabelingIndex функция, вызывающая шаблон labeling_index.html

def LabelingIndex(request):
    #labelings, objects in class Labeling() in models.py
    labelings = Labeling.objects.all()

    c ={"labelings":labelings}
    c.update(csrf(request))
    return render(request,"labeling_index.html", c)

в views.py, one_labeling, функция представлений one_labeling

def one_labeling(request,postID):
       #one_labeling, object in class Labeling  
      one_labeling= Labeling.objects.get(id=postID)
      template = one_labeling_index.html


      if request.method == "POST":
          # forms used in one_labeling_index.html

          form = SentenceForm(request.POST, prefix="sentence")
          form2 = OpenFileForm(request.POST, prefix="file")

          form3 = LabelingForm(request.POST,prefix="form3")
          form9 =LabelingForm2(request.POST,prefix="labeling") 
          if form.is_valid() and 'button1' in request.POST:
                   # do ....
          if form3.is_valid() and 'button2' in request.POST:
                   post_one_labeling(request.POST, one_labeling)

          else:
              form = SentenceForm()
              form2 = OpenFileForm()
              form3 = LabelingForm()

              form9 = LabelingRRGForm2()
          c = {"one_labeling":one_labeling,"form3":form3,"form":form,"form9":form9...... }

          c.update(csrf(request))


         return render(request,template,c,context_instance=RequestContext(request))

в шаблоне Labeling_index.html

{% for one_labeling in labelings %}


  # Link to new id (postid) - page; template one_labeling.html 
  &nbsp;&nbsp Subject: <a href="/label{{ one_labeling.id }}">{{ one_labeling.title }}<a/><br/>



{% endfor %}

в шаблоне one_labeling_index.html

# extending base_one_labeling.html
{% extends "base_one_labeling.html" %}
{% block content %}

# form3
<form3 action="" method="post" enctype="multipart/form-data">{% csrf_token %}

    {{ form3.as_p }}

</form3>

# Form Wizard 
  <p>Label {{ wizard.steps.step1 }} out of {{ wizard.steps.count }} ({{ wizard.steps.step1 }}/{{ wizard.steps.count }})</p>
  {% for field in form %}
    {{field.error}}
  {% endfor %}

  <form action="" method="post" enctype="multipart/form-data">{% csrf_token %}



  <table>
  {{ wizard.management_form }}
  {% if wizard.form.forms %}
      {{ wizard.form.management_form }}
      {% for form1 in wizard.form.forms %}
          {{ form1 }}
      {% endfor %}
  {% else %}
      {{ wizard.form }}
  {% endif %}
  </table>
  {% if wizard.steps.prev %}


  {% endif %}




<html>
<body>

person user1749431    schedule 19.10.2015    source источник


Ответы (1)


Линия

url(r'^label',ContactWizard.as_view([Form1, Form2, Form3])),  

соответствует любому URL-адресу, начинающемуся с "label", поэтому любые другие URL-адреса, которые вы указываете после, никогда не совпадают.
Кроме того, кроме завершающего "/", строки:

url(r'^label(?P<one_labeling>\d+)/$', 'formwizard.views.one_labeling'),
url(r'^label(?P<postID>\d+)$',one_labeling), #<----- here

соответствуют одному и тому же.
Таким образом, вы должны тщательно упорядочивать свои URL-адреса и как-то различать их, чтобы избежать двусмысленности.

person albar    schedule 19.10.2015
comment
Я пробовал следующее: 1) переименование url(r'^label_wiz(?P‹one_labeling›\d+)/$', 'formwizard.views.one_labeling') приводит к тому, что форма мастера работает только с url/label_wiz а не с остальными формами с url /label 2) называя URL-адреса ^label(?P‹one_labeling›\d+)/$', 'formwizard.views.one_labeling', name=label1),url(r'^ label(?P‹postID›\d+)$',one_labeling, name='label2'), но я не знаю, как указать это в шаблоне one_labeling_index.html. - person user1749431; 19.10.2015
comment
3) добавление косой черты к /label, поэтому /label/ и label/+1 не решает проблему. 4) указание действия в форме мастера action=/label при имени label2, name=label в 2). - person user1749431; 19.10.2015
comment
@ user1749431: извините, я слишком запутался в этой форме, поэтому я не могу вам больше помочь. - person albar; 19.10.2015
comment
Мне удалось использовать его, добавив поля LabelingForms в указанные формы form_list. Не удалось найти решение для запуска обоих из-за причин, которые вы указали. - person user1749431; 26.10.2015