0

我有两个页面,分别显示项目摘要和项目详细信息。像这样的 url.py:

(r'^summary/$', 'views.summary'),
(r'^summary_\d|[a-z]{24}$', 'views.itemInfo'),

可以通过summary.htmlid查询一个item然后跳转summary_{{itemId}}.html到显示item的详细信息。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. 我应该在'???'中写什么 地方,要走的网址是动态形成的。

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

4

2 回答 2

1

首先修改您的网址以id从网址中获取:

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

将相同的摘要 url 放入表单操作中

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

现在玩itemin item_detail.html

希望这对您有所帮助。请照顾好imports自己。

于 2013-07-15T04:31:15.220 回答
0

您混合了两个重要的东西:URL 和数据传递方法(POST、GET 等)。HTTP 不是用来接收数据的,例如您计划使用其 URL 和框架(例如 Django)执行的操作,如果您坚持以这种方式进行操作,将会对您不利。

您应该只有一页,即 /summary/。它应该链接到一个视图,该视图检查您是否在 POST 数据中收到了 itemId(如果您保留当前的 ​​HTML 片段)。如果没有,只显示查询表格。否则,添加一个 div 元素,该元素使用模板标签或过滤器相应地显示其数据。内置的if 模板标签可能有用。

作为一个额外的好处,当输入一个条目时,您的搜索表单仍然可用,并且您需要维护的代码更少。

我建议切换到 GET 方法,这意味着做你想做的事。它将允许在您的网站上为条目添加书签的用户保留对项目的引用,而不仅仅是搜索表单。

于 2013-07-15T04:29:45.460 回答