【问题标题】:How can i use one view for different forms in Django如何在 Django 中为不同的表单使用一个视图
【发布时间】:2011-06-28 07:03:53
【问题描述】:

我有如下 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 次,并进行少量更改。我需要执行相同的操作,只是表单名称会不同。

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

有没有可能减少代码

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    将表单存储在字典中,以模型名称为关键字。

    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)
    

    ...等等。

    【讨论】:

      【解决方案2】:

      Django Generic Views 看看人们是如何做这样的事情的。

      【讨论】:

        猜你喜欢
        • 2018-01-25
        • 2016-03-14
        • 1970-01-01
        • 2020-01-29
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        相关资源
        最近更新 更多