2014-10-24 5 views
1

У меня две формы в двух разных вкладках в одном шаблоне. Модели форм связаны через внешний ключ.Django: Сохраняет формы независимо

Когда я пытаюсь сохранить каждую форму независимо от кнопки отправки для каждой формы, но, к сожалению, две формы снова пытаются сохранить данные, даже я нажимаю только одну кнопку отправки.

Views.py

def input(request): 
    my_demographics = DemographicForm(request.POST or None) 
    my_diagnosis = DiagnosisForm(request.POST or None) 

    context = RequestContext(request) 
    if request.method == 'POST': 
     submitted = request.POST.get('form_id', '') 

     if submitted == 'demographics': 
      # Get the Form1 instance 
      my_demographics = DemographicForm(request.POST) 
      if my_demographics.is_valid(): 
       my_demographics_object= my_demographics.save() 
       my_diagnosis=DiagnosisForm({'patient': my_demographics_object.patient_id}) 


     elif submitted == 'diagnosis': 
      # Get the Form2 instance 
      my_diagnosis = DiagnosisForm(request.POST) 
      if my_diagnosis.is_valid(): 
       my_diagnosis.save() 

     else: 
      raise ValueError('No form specified !') 


return render_to_response('input.html', {'frm':my_demographics, 'frm_d': my_diagnosis}, context) 

input.html

<div class="tab-content"> 

    <!-- Tab panes --> 
    <form class="tab-pane fade in active" id="demographics" method="post" > 
     <input type="hidden" name="form_id" value="demographics"> 
     {%crispy frm%} 
    </form> 
    <form class="tab-pane fade" id="diagnosis" method="post"> 
     <input type="hidden" name="form_id" value="diagnosis"> 
     {%crispy frm_d%} 
    </form> 
</div> 
+0

возможно дубликат [Правильный способ обработки нескольких форм на одной странице в Django] (http://stackoverflow.com/questions/1395807/proper-way-to-handle-multiple -forms-on-one-page-in-django) – madzohan

+0

Не совсем, OP хочет представить оба из них с той же формой, и связанный вопрос касается обработки нескольких сообщений на одной странице! –

+0

Я думаю, что вы неправильно поняли вопрос - «... пытаться сохранить каждую форму независимо от кнопки отправки для каждой формы ...» – Brandon

ответ

4

Первый добавить скрытый вход в каждой из ваших форм, которые будут указывать, какая форма размещена:

<div class="tab-content"> 

    <!-- Tab panes --> 
    <form class="tab-pane fade in active" id="demographics" method="post" > 
     <input type="hidden" name="form_id" value="demographics"> 
     {%crispy frm%} 
    </form> 
    <form class="tab-pane fade" id="diagnosis" method="post"> 
     <input type="hidden" name="form_id" value="diagnosis"> 
     {%crispy frm_d%} 
    </form> 
</div> 

Тогда на ваш взгляд, проверьте, какая форма размещена и только сохранить эту форму.

редактировать:

def input(request): 
    context = RequestContext(request) 
    if request.method == 'POST': 
     submitted = request.POST.get('form_id', '') 

     if submitted == 'demographics': 
      # Get the Form1 instance 
      my_demographics = DemographicForm(request.POST) 
      if my_demographics.is_valid(): 
       my_demographics_object= my_demographics.save() 
       my_diagnosis=DiagnosisForm({'patient': my_demographics_object.patient_id}) 
      else: 
       my_diagnosis=DiagnosisForm() 

     elif submitted == 'diagnosis': 
      # Get the Form2 instance 
      my_diagnosis = DiagnosisForm(request.POST) 
      if my_diagnosis.is_valid(): 
       my_diagnosis.save() 
       # here you should redirect 

      my_demographics = DemographicForm() 

     else: 
      raise ValueError('No form specified !') 

    else: 
     my_demographics = DemographicForm() 
     my_diagnosis = DiagnosisForm() 

    return render_to_response(
     'input.html', 
     {'frm':my_demographics, 'frm_d': my_diagnosis}, 
     context 
     ) 
+0

Это правильный ответ и его следует принять. – Brandon

+0

Как я могу проверить, какая форма опубликована? – zinon

+0

'form_id = request.POST.get ('form_id')' request.POST - это словарь и, следовательно, имеет статический метод .get(). Если значение не указано в словаре, возвращается значение «Нет». – Brandon

0

мнение будет иметь имена ввода, которые были в форме, представленной только, что, как вы сейчас, так вы можете добавить скрытое поле и проверить его значение, если form1 или form2, то вы знаете, ведьма была отправлена!

if request.POST: 
    # Get the form submitted 
    submitted = request.POST.get('form_name', '') 

    if submitted == 'form1' 
     # Get the Form1 instance 
     form = Form1Model(request.POST) 

    elif submitted == 'form2' 
     # Get the Form2 instance 
     form = Form2Model(request.POST) 
    else: 
     raise ValueError('No form specified !') 

    # Validate the form 
    if form.is_valid(): 
     # If the form is valid save it 
     if form.save(): 
      # correct data entry 
      messages.info(
       request, 
       _(u"Fichier copié sur le DHS, mise à jour en cours ...") 
      ) 
     else: 
      # Can't save the form 
      messages.warning(
       request, 
       _(u"Un problème est survenu pendant l'enregistrement " 
        u"des données, merci de réessayer plus tard.") 
      ) 
    else: 
     # Form is not valid, show feedback to the user 
     messages.error(
      request, 
      _(u"Merci de corriger les erreurs suivantes.") 
     ) 
else: 
    # Empty forms this is the first call 
    form1 = Form1Model() 
    form2 = Form2Model() 

    # Disclaimer 
    messages.warning(
     request, 
     _(u"L'interface web sera inaccessible durant la mise à jour.") 
    ) 
+0

Нет, они этого не делают. Представление не знает, какая форма была отправлена. Он знает только, что произошел POST. Форма должна быть идентифицирована параметром, который вид может использовать для определения при обработке сообщения. – Brandon

+0

Да, если вы нажмете submit в форме, он будет публиковать только ввод форм, это базовая спецификация HTML. –

+0

И как точно это представление знает? – Brandon

Смежные вопросы