django - 如何配置动态网址

时间:2013-07-15 04:03:56

标签: django

我有两页分别显示项目摘要和项目详细信息。 像这样的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>

我的问题:

  1. 我应该在&#39; ???&#39;地方,要去的网址是动态形成的。

  2. 我如何命名用于显示项目信息的模板file(summary_{{itemId}}.html

2 个答案:

答案 0 :(得分:1)

首先修改你的网址,从网址中抓取id

(r'^summary/(?P<id>\d|[a-z]{24})/$', 'views.itemInfo', name="item_info"),

在表单操作中放置相同的摘要网址

action="{% url 'views.summary' %}"

在摘要视图中,检查请求是否为POST请求,然后获取ID并重定向到详细信息视图,如果请求GETid中找不到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方法,这意味着做你想要的。它允许用户为您网站上的条目添加书签,以保留对该项目的引用,而不仅仅是搜索表单。