我在Django 1.8中使用带有两个应用程序的命名空间URL。请参见下面的简约结构:
车
- 模板
- -cart
- - -cart-template.html
- urls.py
- views.py
商店
- settings.py
- urls.py
的产品
- 模板
- -cart
- - -cart-template.html
- urls.py
- views.py
所以我设置了我的路线,为'主'应用程序:
#Shop/urls.py
urlpatterns = patterns(
'',
url(r'^cart/', include('cart.urls', namespace='cart')),
)
和购物车应用
#Cart/urls.py
urlpatterns = [
url(r'^$', views.index, name='index'),
]
此模板标记完美无缺:
# Cart/templates/cart/cart-template.html
<form action= {% url 'cart:index' %} method="post">
然而,当我在产品的页面上(由产品应用程序处理)并单击一个按钮时,它应该以完全相同的方式重定向我,它给出了404:
# Product/templates/product/product-template.html
<form action= {% url 'cart:index' %} method="post">
换句话说,我不能在另一个应用程序的模板中使用Cart应用程序的命名空间url,Product.How我可以做到这一点/我做错了什么?这是我的输出:
Page not found (404)
Request Method: GET
Request URL: http://0.0.0.0:8000/cart/cart.views.index
似乎尝试使用应该调用的视图作为URL。
编辑:当我在隐藏字段中添加名称属性时,似乎发生了错误:
<!-- Product/templates/product/product-template.html -->
<form action= {% url 'cart:index' %} method="post">
{% csrf_token %}
<!-- this link works -->
<a href={% url 'cart:index'%}> Click</a>
<!-- Submit button goes to correct URL when name attribute of hidden field below is commented out, but I need it to know what to put in cart -->
<input type="hidden" name="id" value="{{ article.id }}">
<input type="submit" value="Bestellen" class="btn btn-default"/>
</form>
当隐藏输入字段的name属性被删除时,我收到以下错误:
MultiValueDictKeyError at /cart/
"'id'"
答案 0 :(得分:0)
感谢您的努力。我发现了错误。在购物车的索引视图中,我习惯于以下行:
return redirect(cart.views.index)
如果购物车被修改(文章被删除或添加数量等),我曾经用来重定向用户。重定向功能在内部使用reverse()函数,因此匹配该视图的URL将被解析。请参阅:https://docs.djangoproject.com/en/1.8/ref/urlresolvers/#reverse
对于命名视图,重定向函数不能使用reverse()函数,因此它无法将cart.views.index解析为输入,只是重定向到它而不解析。
我通过反转命名路由来修复它以获取URL并重定向用户,如下所示:
return redirect(reverse('cart:index'))