所以我有一个项目列表,我希望所有项目在用户单击时将其引导至有关该项目的标准信息页面。我不完全理解 django 中的动态 url 系统。我的内容 html 文件称为detail.html。目标是单击电影项目,然后定向到页面标题“blahblah.com/specic_movie_title”
在views.py中我有:
def detail(reuqest, movie_title):
moviePage = Movie.objects.get(pk=movie_title)
return render_to_response('detail.html', {'detail':moviePage, RequestContext(request))
在 urls.py 中,我必须与之对应的行是:
url(r'^$', views.detail, name='detail')
我可以获得更正这两段代码的帮助吗?
最佳答案
在 django 中,url 通过正则表达式模式进行匹配。
url
的一般格式行是:
url(the_pattern, the_view_name_or_callable, **any_extra_arguments)
关键点是the_pattern
,这是一个正则表达式,任何匹配的内容都可以作为参数传递给 View 函数。
捕获并传递给 View 函数的模式的任何部分实际上都与函数的签名(def
行,您定义名称和参数)相匹配,这一点很重要。否则,django 将抛出错误。
现在,解决这个问题 - 让我们来处理实际问题。
您想要一个类似 /the_great_gatsby
的网址重定向到《了不起的 Gatsby 》页面。
第一步是识别与 the_great_gatsby
匹配的模式。您可以使用[_\w]+
这意味着“一个或多个单词字符或 _”,并将其插入 URL:
url(r'/[_\w]+$', views.detail, name='detail')
接下来,您必须告诉 django 如何捕获该模式并将其作为参数传递给 View 方法。
您的查看方式是:def detail(request, movie_title)
。所以 django 必须传递 /
之后的内容在 url 中(并匹配模式)到参数名称 movie_title
,所以我们想要的是这样的:
def detail(request, movie_title)
^^^^^^^^^^^
---------------|
|
vvvvvvv
url(r'/[_\w]+$', views.detail, name='detail')
我们修改正则表达式以确保 django 捕获任何匹配项,然后为其分配一个名称。为此,请将正则表达式的部分包装在 (?P<name_of_variable>expression)
中。像这样:
url(r'/(?P<movie_title>[_\w+])$', views.detail, name='detail')
现在,无论 /
之后捕获的内容将作为参数 movie_title
传递到views.detail
方法。
当然,您必须确保您的 View 函数对捕获的字符串执行正确的操作。在您的情况下,您的 View 方法正在按主键进行搜索,并且将无法产生任何结果(并且会引发异常),因为没有电影将标题作为主键;但这是另一个问题。
关于python - Django 中的动态 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32941771/