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' >✖</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返回错误并在后台保存表单,而无需加载或重定向页面。