什么';在Django中,从单个页面处理不同表单的最佳方式是什么?

什么';在Django中,从单个页面处理不同表单的最佳方式是什么?,django,django-forms,Django,Django Forms,假设我在视图中定义了3种不同的形式: # views.py form_one = FormOne() form_two = FormTwo() form_three = FormThree() 在我的模板中: <form action="" method="post" id="form-one"> {{ form_one.as_table }} <input type="submit" value="Submit Form One" name="form-one" /

假设我在视图中定义了3种不同的形式:

# views.py
form_one = FormOne()
form_two = FormTwo()
form_three = FormThree()
在我的模板中:

<form action="" method="post" id="form-one">
  {{ form_one.as_table }}
  <input type="submit" value="Submit Form One" name="form-one" />
</form>

<form action="" method="post" id="form-two">
  {{ form_two.as_table }}
  <input type="submit" value="Submit Form Two" name="form-two" />
</form>

<form action="" method="post" id="form-three">
  {{ form_three.as_table }}
  <input type="submit" value="Submit Form Three" name="form-three" />
</form>
有什么意见或建议吗

  • 我的第一个想法是,可以为每个表单操作属性添加一个“?form_id=1”

    <form action="?form_id=1" method="post" id="form-one">
    
  • 另一个选择是创建单独的URL以发布到

    在URL.py中

    url(r'^form1/$', 'someapp.views.process_forms', {'form_class': FormOne}, name='form_one_page'),
    url(r'^form2/$', 'someapp.views.process_forms', {'form_class': FormTwo}, name='form_one_page'),
    url(r'^form3/$', 'someapp.views.process_forms', {'form_class': FormThree}, name='form_one_page'),
    
    在views.py中:

    def process_forms(request, form_class=None):
        ...
        form = form_class(data=request.POST)
        ...
    
  • 您可以检查是否提交按钮名称,因为您在提交按钮中使用了它们

    if request.POST.has_key('form-one'):
        ...
    elif request.POST.has_key('form-two'):
        ...
    elif request.POST.has_key('form-three'):
        ...
    else:
        ...
    

  • 我在一个网站上遇到了类似的问题。我现在没有代码,但我想我做了以下几点:

    if request.method == 'POST': 
        valid = False
        form = FormOne(request.POST) 
        if form.is_valid():
            #handle case where use submitted FormOne
            valid = True
    
        form = FormTwo(request.POST) 
        if form.is_valid():
            #handle case where use submitted FormTwo
            valid = True
    
        form = FormThree(request.POST) 
        if form.is_valid():
            #handle case where use submitted FormThree
            valid = True
    
        if not valid:
            #handle case where none of the forms were valid
    

    处理多个表单的正确方法是在创建表单时使用“prefix”属性。您的视图应该是这样的:

    if request.method == 'POST':
        form1 = Form1(request.POST, prefix='form1')
        form2 = Form2(request.POST, prefix='form2')
        form3 = Form3(request.POST, prefix='form3')
    
        if form1.is_valid() and form2.is_valid() and form3.is_valid():
            # Do whatever you have to do
            pass
    
    else:
        form1 = Form1(prefix='form1')
        form2 = Form2(prefix='form2')
        form3 = Form3(prefix='form3')
    
    模板保持不变,不需要额外的逻辑:

    <form ...>
        {{ form1.as_table }}
        {{ form2.as_table }}
        {{ form3.as_table }}
    
        <input type="submit" ... />
    </form>
    
    
    {{form1.as_table}}
    {{form2.as_table}}
    {{form3.as_table}}
    
    +1。这就是我要做的。这还允许您避免在HTML中使用多个
    标记,而改为提交到同一视图。一个可能的更改:第二个和第三个
    if
    分支可以转换为
    elif
    ,最后一个
    if
    分支可以变成
    else
    。我在这里看到的唯一问题是,如果每个表单都有类似的表单字段,那么FormOne也可能是validate form2,依此类推。
    if request.method == 'POST':
        form1 = Form1(request.POST, prefix='form1')
        form2 = Form2(request.POST, prefix='form2')
        form3 = Form3(request.POST, prefix='form3')
    
        if form1.is_valid() and form2.is_valid() and form3.is_valid():
            # Do whatever you have to do
            pass
    
    else:
        form1 = Form1(prefix='form1')
        form2 = Form2(prefix='form2')
        form3 = Form3(prefix='form3')
    
    <form ...>
        {{ form1.as_table }}
        {{ form2.as_table }}
        {{ form3.as_table }}
    
        <input type="submit" ... />
    </form>