首页 > 解决方案 > 传递参数时 Django URL 出错

问题描述

我正在设置一个新的 URL 路径,但一直找不到页面。这是我的 URL 不起作用:

  url(r'^collections/(?P<collection_name>\d+)$', collections.home, name='collections'),

这是我认为的功能:

def home(request, collection_name, slug=None):
  collection_data = Collections.objects.get(collection_name=collection_name)
  try: 
    logged_id = request.GET.get('admin_id')
  except:
    logged_id = ""
  return render(request, 'collections.html', {'collection_data':collection_data,'logged_id':logged_id})

这是我得到的错误:

在此处输入图像描述

如果我把它变成一个简单的 URL 并从 URL 和视图函数中删除参数,如下所示,它工作正常,所以我知道我指向正确的视图:

url(r'^collections$', collections.home, name='collections'),

在同一个文件中,我有另一个 URL,如下所示,它也可以正常工作:

url(r'^store/(?P<seller_id>\d+)$', store.home, name='store'),

这让我相信我有一个简单的错字或一些我忽略的非常基本的东西。谁能帮我在这里发现错误?谢谢!

标签: pythondjango

解决方案


url 函数用于regex捕获参数。当你写\d+它时,它期望在那个地方有一个或多个数字(数字)。collection_name是一个字符串,所以它不会匹配\d+。您应该编写一个可以匹配字符串的模式,例如[^/]+

url(r'^collections/(?P<collection_name>[^/]+)$', collections.home, name='collections'),

path除非您确实需要将某些 url 与复杂的正则表达式匹配,否则最好转向使用该函数:

from django.urls import path

path('collections/<str:collection_name>', collections.home, name='collections'),

注意:理想情况下,应该以斜杠结束其 url 模式/。默认情况下,Django 在任何传入的 url 中添加一个尾部斜杠,并将用户重定向到这个新的 url。导致人们面临网址不适合他们的问题。


推荐阅读