2016-04-15 65 views
0

注:Django的/ Python的初學者,希望這個問題是清楚的Django的 - 創建表單編輯模型的多個實例

我需要創造一個模型的多個實例可以同時在一個單一的形式編輯的形式,並同時提交。

例如,我有兩個模型,Invite和Guest,其中多個Guests可以與單個Invite關聯。我需要一張表單,可以在其中編輯與邀請相關的所有嘉賓的特定詳細信息,同時提交併保存到數據庫。

我見過關於使用crispy-forms的一些建議,但還沒有設法使它工作。

我已經創建了一個提供一定的輸入形式:

from django import forms 
from app.models import Guest 


class ExtraForm(forms.ModelForm): 
    diet = forms.CharField(max_length=128, required=False) 
    transport = forms.BooleanField(initial=False) 

    # An inline class to provide additional information on the form. 
    class Meta: 
     # Provide an association between the ModelForm and a model 
     model = Guest 
     fields = ('diet', 'transport') 

我的觀點包括:

def extra_view(request, code): 
    invite = get_invite(code) 
    # Get the context from the request. 
    context = RequestContext(request) 

    # Get just guests labelled as attending 
    guests_attending = invite.guest_set.filter(attending=True) 

    if request.method == 'POST': 
     form = ExtraForm(request.POST) 

     print(form.data) 

     # Have we been provided with a valid form? 
     if form.is_valid(): 
      # Save the new category to the database. 
      # form.save(commit=True) 

      print(form) 

      return render(request, 'weddingapp/confirm.html', { 
       'invite': invite, 
      }) 
     else: 
      # The supplied form contained errors - just print them to the terminal for now 
      print form.errors 
    else: 
     # # If the request was not a POST, display the form to enter details. 
     GuestForm = ExtraForm() 

    return render_to_response('weddingapp/extra.html', 
      {'GuestForm': GuestForm, 'invite': invite, 'guests_attending': guests_attending}, context) 

最後,我的表格:

<form id="extra_form" method="post" action="{% url 'weddingapp:extra' invite.code %}"> 

    {% csrf_token %} 

    {% for guest in guests_attending %} 
     <fieldset class="form-group"> 
      <h3>Form for {{ guest.guest_name }}</h3> 
      {% for field in GuestForm.visible_fields %} 
       {{ field.errors }} 

       <div> 
        {{ field.help_text }} 
        {{ field }} 
       </div> 
      {% endfor %} 
     </fieldset> 
    {% endfor %} 

    {{ form.management_form }} 
    <table> 
     {% for form in form %} 
      {{ form }} 
     {% endfor %} 
    </table> 

    <input type="submit" name="submit" value="Submit"/> 
</form> 

任何意見

+1

https://docs.djangoproject.com/es/1.9/topics/forms/formsets/ –

回答

2

You nee d使用FormSet,特別是ModelFormSet

... 
GuestFormSet = modelformset_factory(Guest, form=ExtraForm) 
在您的視圖

你可以使用它作爲一個正常的形式:

formset = GuestFormSet(data=request.POST) 

if formset.is_valid(): 
    formset.save() 

,並在您的模板:

<form method="post" action=""> 
    {{ formset.management_form }} 
     <table> 
     {% for form in formset %} 
      {{ form }} 
     {% endfor %} 
     </table> 
    </form> 

提示:你可以避免避免這種樣板

if request.method == 'POST': 
    form = ExtraForm(request.POST) 

    print(form.data) 

    # Have we been provided with a valid form? 
    if form.is_valid(): 

用一個簡單的快捷鍵:

form = ExtraForm(data=request.POST or None) 
if form.is_valid(): 
    ...