2011-06-28 51 views
0

使用一個視圖不同形式我有5點型號的形式像下面我怎樣才能在Django

class AccountForm(ModelForm): 
      class Meta: 
      model = Account 

    class TransactionForm(ModelForm): 
      class Meta: 
      model = Transaction 
. 
. 
. 
. 

現在對於第一種形式,我有這種看法

def create_account(request, acc_id=None): 
    if acc_id: 
     f = Account.objects.get(pk=acc_id) 
     act1 = 'update/' + acc_id 
    else: 
     f = None 
     act1 = 'create' 

    if request.method == 'POST': # If the form has been submitted... 
     form = AccountForm(request.POST, request.FILES, instance=f) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      form.save() 
      return HttpResponseRedirect('/thanks/') # Redirect after POST 
    else: 
     form = AccountForm(instance=f) # An unbound form 

    return render_to_response('account_form.html', { 
     'form': form, 
     'action':act1, 
     'type':'account', 
    }) 

現在,這個觀點並編輯和創建新的AccountForm。我不得不爲其他五種形式做同樣的事情現在我必須使用次要代碼複製相同的代碼5次。我只需要執行相同的操作,表單名稱將會不同。

有沒有什麼辦法可以爲所有的ModelForms使用一個函數。

我用的模板是這個

<form action="/{{type}}/{{ action }}/" method="post" enctype="multipart/form-data" > 
    {% csrf_token %} 
    {% for field in form %} 
     <div class="fieldWrapper"> 
      {{ field.errors }} 
      {{ field.label_tag }}: {{ field }} 
     </div> 
    {% endfor %} 
    <p><input type="submit" value="Submit" /></p> 
    </form> 

所以基本模板也一樣

我URL.py也有複製同樣的思路像下面

(r'^account/create/$', create_account), 
    (r'^account/update/(\d)/$', create_account), 
    (r'^txn/create/$', create_txn), 
    (r'^txn/update/(\d)/$', create_txn), 

是否有posibility減少代碼

回答

3

將表單存儲在字典中,並以型號名稱爲鍵。

FORMS = { 
    'account': AccountForm, 
    'transaction': TransactionForm, 
    ... 
} 

def create_object(request, object_class, object_id=None): 
    form_class = FORMS[object_class] 
    model = form_class._meta.model 
    if object_id: 
     object = model.object.get(pk=object_id) 

...等等。

0

看看人們在做了這樣的事情。