Django:表单提交后有没有更好的方法'wipe' POST 停止重新提交
Django2: After form submission is there a better way to 'wipe' the POST to stop re-submission
我有一个 Django 应用程序,在一个页面上我有几个针对不同模型的表单。我想要一条 'success' 消息,只需在表单 submission/validation 之后添加到上下文即可轻松实现。然而,这留下了重新提交表单的可能性,这只会产生返回页面的错误,但它仍然让我很烦。
urls:
url_patterns = [
re_path(r'^manager/$', Manager.as_view(), name='manager'),
.......more.....
]
views.py:
class Manager(LoginRequiredMixin, View):
template_name = 'results/manager_templates/manager.html'
form1 = Form1
form2 = Form2
login_url = '/'
redirect_field_name = 'redirect_to'
def get(self, request, *args, **kwargs):
form1 = self.form1()
form2 = self.form2()
context = {
'form1': form1,
'form2': form,}
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
submit_clicked = request.POST.get('submit')
form1 = self.form1()
form2 = self.form2()
context = {}
if submit_clicked == 'Form 1':
form1 = self.form1(request.POST)
if form1.is_valid():
form1.save()
context['message'] = 'Form 1 successful'
# reset the form
form1 = self.form1()
# return HttpResponseRedirect(
# reverse('results:manager',
# ))
else:
print('NOT VALID')
elif submit_clicked == 'Form 2':
... do same stuff as above ...
context['form1'] = form1
context['form2'] = form2
return render(request, self.template_name, context)
如果我要取消注释掉 HttpResponseRedirect,在验证并添加表单后,如下所示:
return HttpResponseRedirect(
reverse('results:manager',
))
然后它 returns 我到我的页面,如果我刷新表单就不会重新提交。但是,如果不通过 url:
我就无法传递这个参数
即如果我要写:
return HttpResponseRedirect(
reverse('results:manager',
kwargs={'success':'success'}
))
我收到错误:
Reverse for 'manager' with keyword arguments '{'success': 'success'}' not found. 1 pattern(s) tried: ['manager/$']
如果我将 urls.py 更改为:
url_patterns = [
re_path(r'^manager/$', Manager.as_view(), name='manager'),
re_path(r'^manager/(?P<success>)$', Manager.as_view(), name='manager'),
]
我收到错误:
Reverse for 'manager' with keyword arguments '{'success': 'success'}' not found. 2 pattern(s) tried: ['manager/(?P<success>)$', 'manager/$']
是否可以传递不需要添加到 url 正则表达式的 HttpResponseRedirect 变量?或者是否有任何其他方法 'reset' 我的 request.POST 以便在不使用 HttpResponseRedirect 的情况下不会重新提交表单?
如您所见,您应该在成功后重定向 post 以防止重复请求。
当您更改网址时,您没有在 success
组中添加任何匹配字符。
re_path(r'^manager/(?P<success>\w+)$', Manager.as_view(), name='manager'),
另一种选择是将变量存储在查询字符串中,例如/manager/?success=success
,那么您可以在重定向后从 request.GET
中检索值。
您还可以在会话中存储数据,或使用 messages framework。
我有一个 Django 应用程序,在一个页面上我有几个针对不同模型的表单。我想要一条 'success' 消息,只需在表单 submission/validation 之后添加到上下文即可轻松实现。然而,这留下了重新提交表单的可能性,这只会产生返回页面的错误,但它仍然让我很烦。
urls:
url_patterns = [
re_path(r'^manager/$', Manager.as_view(), name='manager'),
.......more.....
]
views.py:
class Manager(LoginRequiredMixin, View):
template_name = 'results/manager_templates/manager.html'
form1 = Form1
form2 = Form2
login_url = '/'
redirect_field_name = 'redirect_to'
def get(self, request, *args, **kwargs):
form1 = self.form1()
form2 = self.form2()
context = {
'form1': form1,
'form2': form,}
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
submit_clicked = request.POST.get('submit')
form1 = self.form1()
form2 = self.form2()
context = {}
if submit_clicked == 'Form 1':
form1 = self.form1(request.POST)
if form1.is_valid():
form1.save()
context['message'] = 'Form 1 successful'
# reset the form
form1 = self.form1()
# return HttpResponseRedirect(
# reverse('results:manager',
# ))
else:
print('NOT VALID')
elif submit_clicked == 'Form 2':
... do same stuff as above ...
context['form1'] = form1
context['form2'] = form2
return render(request, self.template_name, context)
如果我要取消注释掉 HttpResponseRedirect,在验证并添加表单后,如下所示:
return HttpResponseRedirect(
reverse('results:manager',
))
然后它 returns 我到我的页面,如果我刷新表单就不会重新提交。但是,如果不通过 url:
我就无法传递这个参数即如果我要写:
return HttpResponseRedirect(
reverse('results:manager',
kwargs={'success':'success'}
))
我收到错误:
Reverse for 'manager' with keyword arguments '{'success': 'success'}' not found. 1 pattern(s) tried: ['manager/$']
如果我将 urls.py 更改为:
url_patterns = [
re_path(r'^manager/$', Manager.as_view(), name='manager'),
re_path(r'^manager/(?P<success>)$', Manager.as_view(), name='manager'),
]
我收到错误:
Reverse for 'manager' with keyword arguments '{'success': 'success'}' not found. 2 pattern(s) tried: ['manager/(?P<success>)$', 'manager/$']
是否可以传递不需要添加到 url 正则表达式的 HttpResponseRedirect 变量?或者是否有任何其他方法 'reset' 我的 request.POST 以便在不使用 HttpResponseRedirect 的情况下不会重新提交表单?
如您所见,您应该在成功后重定向 post 以防止重复请求。
当您更改网址时,您没有在 success
组中添加任何匹配字符。
re_path(r'^manager/(?P<success>\w+)$', Manager.as_view(), name='manager'),
另一种选择是将变量存储在查询字符串中,例如/manager/?success=success
,那么您可以在重定向后从 request.GET
中检索值。
您还可以在会话中存储数据,或使用 messages framework。