Django添加form的action参数后无法创建新对象问题
问题原因与解决方案
问题原因
给表单添加action="{% url 'home:contact_thank_you' %}"后,表单的提交目标从原有的当前页面index视图切换到了contact_thank_you URL对应的视图。
原index视图包含完整的POST数据处理逻辑:验证表单有效性、保存Email及关联的EmailMessage到数据库。但现在表单提交到contact_thank_you视图,若该视图未编写处理POST请求、验证表单和保存数据的代码,提交的数据就不会被处理,自然无法存入数据库。
解决方案
有两种可行修复方式:
方式一:在contact_thank_you视图中添加数据处理逻辑
将原index视图里处理POST请求的代码迁移到contact_thank_you视图,示例如下:
def contact_thank_you(request): if request.method == 'POST': form_email = EmailForm(data=request.POST) form_message = EmailMessageForm(data=request.POST) if form_email.is_valid() and form_message.is_valid(): form_email.save() email = Email.objects.last() message = form_message.save(commit=False) message.email = email message.save() # 处理完成后渲染感谢页面 return render(request, 'home/contact_thank_you.html') # GET请求直接渲染感谢页 return render(request, 'home/contact_thank_you.html')
保持表单的action参数不变即可。
方式二:在index视图处理完数据后重定向到感谢页面
保留表单无action的状态(默认提交到index视图),在index视图完成数据保存后,通过redirect跳转至感谢页面,修改后的index视图示例:
from django.shortcuts import redirect, render def index(request): """The home page.""" # Send a message. if request.method != 'POST': # No data submitted; create a blank form. form_email = EmailForm() form_message = EmailMessageForm() else: # POST data submitted; process data. form_email = EmailForm(data=request.POST) form_message = EmailMessageForm(data=request.POST) if form_email.is_valid() and form_message.is_valid(): form_email.save() email = Email.objects.last() message = form_message.save(commit=False) message.email = email message.save() # 保存成功后重定向到感谢页面 return redirect('home:contact_thank_you') # Display a blank or invalid form. context = {'form_email': form_email, 'form_message': form_message} return render(request, 'home/index.html', context)
这种方式符合PRG(Post/Redirect/Get)设计模式,能避免用户刷新页面时重复提交表单的问题。
内容的提问来源于stack exchange,提问作者Maxwell
相关产品推荐
相关产品推荐

