因此,我有一个项目列表,我希望所有项目都能在单击时将用户定向到有关该项目的标准信息页面。我不完全了解Django中的动态url系统。我的内容的html文件称为detail.html。目标是单击电影项目,并定向到页面标题“ blahblah.com/specific_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
,这是一个正则表达式,任何匹配项都可以作为参数传递给视图函数。重要的是,捕获并传递给视图函数的模式的任何部分都必须与函数的签名(
def
行,您在其中定义名称和参数)相匹配。否则,django将引发错误。因此,现在解决了这一问题-让我们处理实际问题。
您希望将
/the_great_gatsby
之类的网址重定向到The Great 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方法是按主键进行搜索的,因此不会产生任何结果(并且会引发异常),因为没有影片将标题作为主键。但这是另一个问题。