Django 正确使用url模式的方法
我创建了一个表单,通过提交将一个项目上传到数据库。问题是,如果我按f5,它会再次提交表单,因为URL现在不同了 我有这两种url模式Django 正确使用url模式的方法,django,django-forms,django-views,Django,Django Forms,Django Views,我创建了一个表单,通过提交将一个项目上传到数据库。问题是,如果我按f5,它会再次提交表单,因为URL现在不同了 我有这两种url模式 urlpatterns = [ url(r'(?i)^CMS/$', views.CMS, name='CMS'), url(r'^createItem/$', views.createItem, name='createItem') ] 我的观点是这样的 def CMS(request):
urlpatterns = [
url(r'(?i)^CMS/$', views.CMS, name='CMS'),
url(r'^createItem/$', views.createItem, name='createItem')
]
我的观点是这样的
def CMS(request):
form = itemCreateForm()
context = {
'form' : form,
'message' : 'Content Manage Site'
}
return render(request, 'CMS.html', context)
def createItem(request):
f = itemCreateForm(request.POST)
if f.is_valid():
f.save()
pass
form = itemCreateForm()
context = {
'form' : form,
'message' : 'ItemCreated!'
}
return render(request, 'CMS.html', context)
CMS.html
{% if message %}
{{ message }}
{% endif %}
<div class='newItemFields'>
<form action="{% url 'kar:createItem' %}" method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
</div>
我从homepage/CMS/开始,填写表单并按submit,然后view functioncreateItem
运行并创建并保存数据库中的对象。并将用户发送到homepage/CMS/createItem。现在,每次用户按f5键时,createItem函数都会再次运行,并将另一个值与前一个值相同的对象插入数据库,即使输入字段为空(我无法理解)
我还写了两次form=itemCreateForm()
,我认为这是可疑的
我想做的是在运行createItem之后,它应该将用户发送回homepage/CMS/而不是homepage/CMS/createItem。这是正确的方法吗?或者有一种聪明的方法可以做到这一点。在createItem函数的末尾,您正在呈现页面的HTML,而不是重定向。相反,你需要这样做
return HttpResponseRedirect(reverse('kar:index'))
您需要导入HttpResponseRedirect和reverse,用于通过URL名称解析URL
看看这个:
我想做的是在运行createItem之后,它应该发送
用户返回主页/CMS/而不是主页/CMS/createItem。那会吗
这是正确的方法吗?还是有一种聪明的方法可以做到这一点
这确实是正确和明智的做法。在表单提交成功后,使用一个视图句柄GET和POST,然后重定向。这确保了用户不能仅仅通过刷新来重新提交表单。您可以解决重复代码的问题
urlpatterns = [
url(r'(?i)^$', views.index, name='index'),
url(r'^createItem/$', views.createItem, name='createItem')
]
然后结合你的观点
def createItem(request):
if request.method == 'POST':
f = itemCreateForm(request.POST)
if f.is_valid():
f.save()
return HttpResponseRedirect('/homepage/CMS/')
else :
form = itemCreateForm()
context = {
'form' : form,
'message' : 'Content Manage Site'
}
return render(request, 'CMS.html', context)
请注意,代码现在变短了,当表单无效时,它会向用户提供适当的反馈。并且您无法刷新以提交两次。我们需要对模板做一点小改动
<div class='newItemFields'>
<form action=method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
</div>
{%csrf_令牌%}
{{form.as_p}}
消息显示部分不再需要了非常抱歉,我在url模式中写入了错误的url。不应该是一个索引,但我的CMS。这会改变什么吗?不用担心。这没什么大变化。您可以随时更改urls.py,并且可以确保重定向不会中断,方法是使用
reverse
函数(在为url指定名称后)尝试此操作,它给了我一个django.core.urlresolvers.NoReverseMatch:reverse for'index',arguments'()'和关键字arguments'{}未找到。尝试了1个模式:[“主页/(?i)^$”]这现在解决了吗?
<div class='newItemFields'>
<form action=method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
</div>