【问题标题】:Dynamic Url's in DjangoDjango中的动态网址
【发布时间】:2015-10-05 05:23:59
【问题描述】:

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

我可以得到帮助来纠正这两个代码块吗?

【问题讨论】:

  • 阅读tutorial,它涵盖了这个问题和其他基本问题。

标签: python django url dynamic


【解决方案1】:

在 django 中,url 由正则表达式模式匹配。

url 行的一般格式是:

url(the_pattern, the_view_name_or_callable, **any_extra_arguments)

关键是the_pattern,它是一个正则表达式,任何匹配的都可以作为参数传递给视图函数。

重要的是,捕获并传递给视图函数的模式的任何部分实际上都与函数的签名匹配(def 行,您在其中定义名称和参数)。否则django会报错。

那么现在,让我们解决这个问题 - 让我们来处理实际问题。

你想要一个像/the_great_gatsby 这样的网址来重定向到了不起的盖茨比的页面。

第一步是识别与the_great_gatsby 匹配的模式。您可以使用[_\w]+,意思是“一个或多个单词字符或_”,并将其插入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 方法。


当然,您必须确保您的视图函数对捕获的字符串执行正确的操作。在您的情况下,您的视图方法正在按主键搜索并且将无法产生任何结果(并且会引发异常),因为没有将标题作为主键的电影;但这是另一个问题。

【讨论】:

  • 谢谢,这个很清楚!是的,刚刚遇到了这个问题。好的,所以“pk”代表主键。那么我需要那个“movie_object”行吗?可以直接传title吗?
  • 我让它工作了!但是我的数据都没有被传递,并且 url 仍然显示为“~~~/detail.html”
  • 我认为你应该问一个单独的问题,因为这是另一个问题。
【解决方案2】:

你可以像这样配置你的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 %}

【讨论】:

  • 当我点击链接时,我仍然在 ~~~/detail.html 处看到“页面未找到”
猜你喜欢
  • 2012-03-15
  • 2012-12-01
  • 1970-01-01
  • 2013-11-29
  • 2021-04-27
  • 2013-08-17
  • 2011-01-10
  • 2012-04-17
相关资源
最近更新 更多