【问题标题】:Structuring Django URL Patterns构建 Django URL 模式
【发布时间】:2014-08-24 15:30:40
【问题描述】:

我是 Django 新手,在理解 URL 模式时遇到了困难。当用户访问我网站的索引页面(http://www.example.com)时,他们可以进行搜索。他们在一个框中输入名字,在另一个框中输入姓氏,然后单击搜索按钮。用户的搜索在结果页面 (http://www.example.com/results) 上返回信息。当我使用以下模式时,一切正常:

urlpatterns = patterns('',
...
url(r'^results',views.results, name='results'),
...
)

但是,我将如何呈现这样一个捕获实际查询的 URL,而不是为每个搜索呈现一个“/results”URL:

http://www.example.com/results/<first_name>'+'<last_name>/

'first_name' 和 'last_name' 是存储在视图中的 request.session[] 变量。我确信这是一个非常简单的问题,但鉴于我对这一切都很陌生,我希望有人能帮助我理解它是如何工作的。

感谢您的帮助。

【问题讨论】:

  • 通常搜索参数通过查询字符串传递:http://www.example.com/results/?first_name=john&amp;last_name=doe,然后您可以使用request.GET 在视图中访问它们。所以不需要指定另一个网址。
  • 当然可以。那么,我可以做些什么来显示 url 的完整路径而不仅仅是“/results”?我想这不是一个大问题,但视觉效果很好。
  • 如果总是提供 first_name 和 last_name,您可以将它们用作 url 参数 url(r'^results/(?P\w+/(?P\w+))' ,views.results, name='results'),

标签: django url-pattern


【解决方案1】:

通过在您的 url 模式中命名组。当然,如果你只是连接 first_name 和 last_name,这会很复杂,因为你不知道如何区分谁是任何人。你应该像这样连接first_name+"/"+last_name,然后你的 url 模式应该是这样的:

url(r'^results/(?P[\w-]+)/(?P[\w-]+)$',views.results, name='results'),

那么,你的结果视图应该接受两个参数:

def results(request, first_name, last_name):

希望您熟悉正则表达式。而且,如果 first_name 和 last_name 不正确(即 void、奇数值等),您需要控制自己。

【讨论】:

  • 我收到一条错误消息,提示我正在请求“example.com/results”并且没有匹配的网址格式。在这个解决方案中,我是否需要调整我的 HttpResponse 以请求相同的正则表达式?目前,我的模板位于“results.html”,这是我在 HttpResponse 中要求的。
  • 这是因为您不必请求此网址。您必须请求 example.com/results/first_name/last_name。此请求将调用您的视图,您的视图会将数据传递给您的模板以呈现它。
【解决方案2】:

感谢您的所有建议!正则表达式非常强大;我需要花几个星期更仔细地学习它。使用您的建议,我能够使用以下方法使其工作:

urls.py

url(r'^results/(?P<first_name>\w)+(?P<last_name>\w)',views.results, name='results')
...

views.py

def search(request):
...
return HttpResponseRedirect('results/' + first_name + '+' + last_name)

def results(request,first_name,last_name):
...

再次感谢!

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2013-03-16
    • 2019-02-03
    • 2023-03-10
    • 1970-01-01
    • 2015-07-13
    • 2015-08-22
    • 2021-12-25
    • 2011-04-10
    相关资源
    最近更新 更多