所以我有一个项目列表,我想让所有项目在点击时将用户引导到关于该项目的标准信息页面。我不完全理解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')
我可以帮助纠正这两段代码吗?
答案 0 :(得分:3)
在django中,网址与正则表达式匹配。
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(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
方法。
当然,您必须确保您的视图功能正在使用捕获的字符串做正确的事情。在您的情况下,您的视图方法是通过主键搜索并且将无法产生任何结果(并将引发异常),因为没有电影将标题作为主键;但这是另一个问题。
答案 1 :(得分:0)
您可以像这样配置url
和view
<强> urls.py 强>
url(r'^movie/(?P<movie_title>\w+)$', views.movie_detail, name='detail')
<强> views.py 强>
def movie_detail(request, movie_title):
movie_object = Movie.objects.get(pk=movie_title)
return render(request, 'moview-detail.html', {'movie_object':movie_object}
并在您的html {% url 'app_name:detail' movie_title %}