Django 中的动态 Url
Dynamic Url's in Django
所以我有一个项目列表,我希望所有项目在单击时将用户引导到关于该项目的标准信息页面。我不完全理解 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')
我能得到帮助来更正这两块代码吗?
您可以像这样配置 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 %}
在 django 中,urls 通过正则表达式模式匹配。
url
行的一般格式为:
url(the_pattern, the_view_name_or_callable, **any_extra_arguments)
重点是the_pattern
,这是一个正则表达式,匹配到的都可以作为参数传递给视图函数。
捕获并传递给视图函数的模式的任何部分都必须与函数的签名实际匹配(def
行,您可以在其中定义名称和参数)。否则,django 会抛出错误。
所以现在,抛开这个问题 - 让我们处理实际问题。
您希望 url 像 /the_great_gatsby
重定向到 了不起的盖茨比 的页面。
第一步是识别匹配 the_great_gatsby
的模式。您可以使用 [_\w]+
表示 "one or more word characters or _",并将其插入 URL:
url(r'/[_\w]+$', views.detail, name='detail')
接下来,您必须告诉 django 如何捕获该模式并将其作为参数传递给视图方法。
您的查看方式为: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
方法。
当然,您必须确保您的视图函数对捕获的字符串执行正确的操作。在您的情况下,您的视图方法是按主键搜索的,并且不会产生任何结果(并且会引发异常),因为没有电影将标题作为主键;但这是另一个问题。
所以我有一个项目列表,我希望所有项目在单击时将用户引导到关于该项目的标准信息页面。我不完全理解 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')
我能得到帮助来更正这两块代码吗?
您可以像这样配置 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 %}
在 django 中,urls 通过正则表达式模式匹配。
url
行的一般格式为:
url(the_pattern, the_view_name_or_callable, **any_extra_arguments)
重点是the_pattern
,这是一个正则表达式,匹配到的都可以作为参数传递给视图函数。
捕获并传递给视图函数的模式的任何部分都必须与函数的签名实际匹配(def
行,您可以在其中定义名称和参数)。否则,django 会抛出错误。
所以现在,抛开这个问题 - 让我们处理实际问题。
您希望 url 像 /the_great_gatsby
重定向到 了不起的盖茨比 的页面。
第一步是识别匹配 the_great_gatsby
的模式。您可以使用 [_\w]+
表示 "one or more word characters or _",并将其插入 URL:
url(r'/[_\w]+$', views.detail, name='detail')
接下来,您必须告诉 django 如何捕获该模式并将其作为参数传递给视图方法。
您的查看方式为: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
方法。
当然,您必须确保您的视图函数对捕获的字符串执行正确的操作。在您的情况下,您的视图方法是按主键搜索的,并且不会产生任何结果(并且会引发异常),因为没有电影将标题作为主键;但这是另一个问题。