2011-06-28 7 views
0

で異なる形式のための1つのビューを使用することができます私ははどのように私はジャンゴ

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

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

以下のような5つのモデルのフォームは今すぐ最初のフォームのために私は

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つのフォームについても同じことをしなければなりません。今私は小さなコードで5回同じコードをコピーする必要があります。私は同じ操作だけを実行する必要がありますフォーム名は異なるでしょう。

すべてのModelFormに1つの関数を使用できる方法はありますか?

私が使用したテンプレートは、この

<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), 

以下のように同じ行をコピーしている任意の働かがありますコードを減らすの

答えて

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) 

...など。