如何在Django中为不同的表单使用一个视图

时间:2011-06-28 07:03:53

标签: python django forms

我有5个模型表格,如下所示

    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次与次要的chnages。我只需要执行相同的操作,表单名称会有所不同。

有什么方法可以为所有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),

是否有减少代码的可能性

2 个答案:

答案 0 :(得分: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)

......等等。

答案 1 :(得分:0)

了解人们如何在Django Generic Views做这样的事情。