2011-09-20 55 views
0

我沒有一個例子,因爲我沒有在任何有關工作的權利,但我還是好奇,閱讀有關表單集的文檔後:Django的形式質疑

什麼是一個最佳實踐有具有多個不同模型表單的同一時間發佈的單一視圖(相當於1個組合表單,因爲您不能同時發佈多個表單,但由於缺少更好的解釋......),有些是單一模型表單,以及其他的一個或多個表單集(例如,Person,他的1 Address,以及他的1個或多個Pet對象),就像Django用TabularInline所做的那樣。內線一直在Django有一段時間,所以我的懷疑是,有比我可以通過簡單地複製/粘貼admin/options.py中的內容更好的做法,不是嗎?

在此先感謝

回答

2

你應該:

  • 確保您使用的交易(因此,要確保他們打開,並且您正在使用MySQL之外的東西用MyISAM表)。這是真的,真的,但現在更是如此。 :)

  • 使用多個forms.Form/forms.ModelForm對象,它們被分組在一起以單一HTML <form>元件,諸如...

的Python:

from django import forms 

class FormA(forms.ModelForm): 
    [...] 

class FormB(forms.ModelForm): 
    [...] 

HTML:

<form method="post" action="/path/to/view/"> 
    {% csrf_token %} 

    {{ form_a }} 
    {{ form_b }} 

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

然後,當你正在處理您的表格,只需處理它們,並確保您要求兩者都有效,才能在成功案例中實際完成視圖。

from django.db import transaction 
from django.http import HttpResponseRedirect 
from django.template.response import TemplateResponse 
from myapp.forms import FormA, FormB 

@transaction.commit_on_success 
def present_forms_to_user(request): 
    if request.method == 'POST': 
     form_a = FormA(request.POST) 
     form_b = FormB(request.POST) 

     if form_a.is_valid() and form_b.is_valid(): 
      # processing code 

      return HttpResponseRedirect('/path/to/thank/you/page/') 
    else: 
     form_a = FormA() 
     form_b = FormB() 

    return TemplateResponse(request, 'templates/eggs.html', { 
     'form_a': form_a, 
     'form_b': form_b, 
    }) 

作爲一個免責聲明,請記住,這是一個基本的示例存根,並不是要盲目複製。你的最終用例可能會略有不同,這很好。

+0

感謝您的回答。值得注意的是formset的'prefix'參數(https://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-more-than-one-formset-in-a-view) 。 – orokusaki