Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 正确使用url模式的方法_Django_Django Forms_Django Views - Fatal编程技术网

Django 正确使用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):

我创建了一个表单,通过提交将一个项目上传到数据库。问题是,如果我按f5,它会再次提交表单,因为URL现在不同了

我有这两种url模式

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 function
createItem
运行并创建并保存数据库中的对象。并将用户发送到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>