2014-07-03 28 views
0

我是Django的新手,并且无法理解URL模式。当用户访问我网站的索引页面(http://www.example.com)时,他们有能力进行搜索。他们在一个框中输入名字,在另一个框中输入姓氏,然后单击搜索按钮。用户的搜索返回结果页面上的信息(http://www.example.com/results)。一切都完美的作品时,我用下面的模式:构造Django URL模式

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

然而,而不是撕心裂肺一个“/结果”网址在每一次搜索的,我怎么会呈现这样的URL,捕捉实际查询:

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

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

我很感激帮助。

+0

通常,搜索参数通过查询字符串传递:'http://www.example.com/results/?first_name = john&last_name = doe',然后您可以使用'request.GET'在您的视图中访问它们。所以不需要指定另一个url。 – Germano

+0

当然,这是有效的。那么,我可以做什么来显示url的完整路径而不是'/ results'?我想这不是一个大问题,但视觉效果很好。 – datasci

+0

如果始终提供了first_name和last_name,则可以将它们用作url参数url(r'^ results /(?P \ w + /(?P \ w +))',views.results,name ='results') , – Alvaro

回答

0

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

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

然后,你的结果来看,应该接受两个参数:

def results(request, first_name, last_name):

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

+0

我收到一条错误消息,说我要求'http://www.example.com/results',并且没有任何网址格式匹配。在这个解决方案中,我是否需要调整我的HttpResponse以请求相同的正则表达式?目前,我的模板位于'results.html',这正是我在HttpResponse中请求的内容。 – datasci

+0

这是因为您不必请求此网址。您必须请求example.com/results/first_name/last_name。此请求会调用您的视图,您的视图会将数据传递给您的模板以进行呈现。 – argaen

0

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

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): 
... 

再次感谢!