Django中的动态网址

时间:2015-10-05 05:24:00

标签: python django url dynamic

所以我有一个项目列表,我想让所有项目在点击时将用户引导到关于该项目的标准信息页面。我不完全理解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')

我可以帮助纠正这两段代码吗?

2 个答案:

答案 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)

您可以像这样配置urlview

<强> 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 %}