Python 在同一视图中处理两个窗体

Python 在同一视图中处理两个窗体,python,django,Python,Django,我有以下功能 def jobs(request): pms = PM.objects.all() a = Job.objects.all().filter(enddate__gte=datetime.date.today()).order_by('enddate') ljform = LaunchJobForm(request.POST or None) form = LimitedJobForm(request.POST or None, prefix='add

我有以下功能

def jobs(request):
    pms = PM.objects.all()
    a = Job.objects.all().filter(enddate__gte=datetime.date.today()).order_by('enddate')
    ljform = LaunchJobForm(request.POST or None)
    form = LimitedJobForm(request.POST or None, prefix='add')
    if request.method=='POST' and 'addjobbtn' in request.POST:
      if form.is_valid():
       ...do stuff...
    elif request.method=='POST' and 'launchjobbtn' in request.POST:
      print('test')
      ... do other stuff...
我的ljform是

<form method='POST' action = '' class='launchjob'>{% csrf_token %}
    {{ ljform }}
    <td><button class = 'btn btn-primary' name='launchjobbtn' type='submit'>Launch Job</button></td>
    <td><input id='emailcheck' type="checkbox">Modify Email</input></td>
</form>
{%csrf\u令牌%}
{{ljform}}
启动作业
修改电子邮件
我的工作表格是:

<div class='jobfrm{% if form.errors %} has_errors{% endif %}'>
    <span class='closex' >&#10006;</span>
    <form method='POST' action = '' class='addjob'>{% csrf_token %}
        {{form|crispy}}
        <input class = 'btn btn-default' name='addjobbtn' type = 'submit' value = 'Submit'/>
    </form> 
</div>  

✖
{%csrf_令牌%}
{{form | crispy}}

我的问题是,当我单击LaunchJob按钮时,jobfrm上会触发表单验证错误。它实际上并没有采用那个if路径。它采用elif路径并打印“test”。但是我不明白它为什么会触发另一个表单。

您只想传递
请求。如果表单是已提交的表单,请将
作为参数发布到表单中。这意味着您必须执行以下操作:

def jobs(request):

    pms = PM.objects.all()
    a = Job.objects.all().filter(enddate__gte=datetime.date.today()).order_by('enddate')

    ljform = LaunchJobForm()
    form = LimitedJobForm()

    if request.method=='POST' and 'addjobbtn' in request.POST:
        form = LimitedJobForm(request.POST)          
        if form.is_valid():
         ...do stuff...

    elif request.method=='POST' and 'launchjobbtn' in request.POST:
        ljform = LaunchJobForm(request.POST)
        print('test')
        ... do other stuff...

在执行此操作时,虽然两个表单都没有传递到上下文中,因此它们不会被呈现,并且我得到了
异常值:赋值前引用的局部变量“form”
,但您必须包含
views.py
/
forms.py
文件中的更多信息。在我上面的回答中,
form
ljform
将正常地传递到上下文中……您只需要合适的
else
语句来实例化没有POST的表单,当然。@DanielRoseman ie不是我在
if
语句之前实例化
ljform
form
的方式吗?对不起,我的消息是给OP的,为了解决他们的异常。我个人会处理得更清楚。我将使用2个独立的视图(函数或基于类的视图)和2个模板标记,而不是1个视图。然后添加到表单属性“action=“/url\u of_that\u view/”,提交操作时将请求该属性。我认为这种方法安排得很好,不像一个大的混乱视图。我以前尝试过这种解决方案类型,但我的问题是(可能我做错了)我不想仅仅为了提交表单而将用户转发到另一个页面。是的,这很简单。提交后,您可以重定向到用户的url,或者重定向到主页,或者使用AJAX返回错误并在后台保存表单,而无需加载或重定向页面。