我有两页分别显示项目摘要和项目详细信息。 像这样的url.py:
(r'^summary/$', 'views.summary'),
(r'^summary_\d|[a-z]{24}$', 'views.itemInfo'),
summary.html
可以按ID查询项目,然后跳转到summary_{{itemId}}.html
以显示项目详细信息。 itemId是mongodb ObjectId,然后我使用正则表达式' \d|[a-z]{24}
'。
在summary.html
模板中,我写道:
<form action="???" method="post">
query Item by id:
<input type="text" name="itemId" value="" /><br />
<input type="submit" value="query" />
</form>
我的问题:
我应该在&#39; ???&#39;地方,要去的网址是动态形成的。
我如何命名用于显示项目信息的模板file(summary_{{itemId}}.html
?
答案 0 :(得分:1)
首先修改你的网址,从网址中抓取id
:
(r'^summary/(?P<id>\d|[a-z]{24})/$', 'views.itemInfo', name="item_info"),
在表单操作中放置相同的摘要网址
action="{% url 'views.summary' %}"
在摘要视图中,检查请求是否为POST
请求,然后获取ID并重定向到详细信息视图,如果请求GET
或id
中找不到POST
再次显示摘要视图:
def summary(request):
if request.method == 'POST':
id = request.POST.get('itemId')
if id:
return redirect(reverse('item_info', kwargs={'id': id}))
return render_to_response(
'summary.html', {}, context_instance=RequestContext(request))
详细信息视图应按ID查询项目并在上下文中传递项目。您只需将模板命名为item_detail.html
,并使用单个模板传递对象实例以显示不同的项目:
def itemInfo(request, id):
item = MyItemModel.objects.get(id=id)
return render_to_response(
'item_detail.html', {'item': item}, context_instance=RequestContext(request))
现在在item
中使用item_detail.html
。
希望这会对你有所帮助。请照顾imports
你自己。
答案 1 :(得分:0)
您正在混合两件重要的事情:URL和数据传递方法(POST,GET等)。 HTTP不会接收数据,例如您计划使用其URL和框架(例如Django)执行的操作,如果您继续这样做,将对您不利。
你应该只有一个页面,即/ summary /。它应链接到一个视图,该视图检查您是否在POST数据中收到了itemId(如果您保留当前的HTML片段)。如果没有,只显示查询表单。否则,添加一个div元素,使用模板标签或过滤器相应地显示其数据。内置的if
template tag可能会有用。
作为额外的奖励,当您输入一个条目时,您的搜索表单仍然可用,并且您将需要更少的代码来维护。
我建议切换到GET方法,这意味着做你想要的。它允许用户为您网站上的条目添加书签,以保留对该项目的引用,而不仅仅是搜索表单。