如何在超链接中嵌入模板变量 - Django模板

时间:2013-05-30 17:37:17

标签: python html django django-templates

我是Web开发,Django,python,html等的新手。我有一个基本的Django应用程序,它显示已输入数据库的出版物标题列表。这很好用。

我现在想要这样做,以便每个出版物标题都是一个链接 - 当被点击时 - 呈现另一个模板,其中包含被点击的出版物的详细信息。到目前为止,我知道如何获取发布链接以呈现模板,但我试图弄清楚如何将发布标题传递给超链接,以便在详细信息模板中呈现的数据将特定于标题那是被选中的。

以下是我在我的出版物模板中显示的所有出版物(这是不正确的,但希望它澄清了我想要做的):

<html><head><title>Publications</title></head>
<body>
<h1>Publications</h1>
<ul>
{% for publication in publication_list %}
<li><strong><a href="/publications/{{publication.title}}/detail">{{ publication.title}}</strong>    </li>
</a>
{% endfor %}
</ul>
</body></html>

为了上下文,处理此问题的url模式是:

url(r'^(?P<detail_type>\w+)/(?P<link_item>\w+)/detail$', get_details)

视图功能是:     //注意:我可能在这里有一些逻辑/语法错误,但这是基本的想法

def get_details(request, detail_type=None, link_item=None):
    if detail_type == "publications":
        publication = Publication.objects.filter(title__iexact=link_item)
        return render(request, 'publication_detail.html', {'detail_type' : detail_type, 'publication' : publication})
    elif ....

就像我说的,我是一个非常初学者,所以如果我以错误的方式接近这个,任何建议或资源都会受到赞赏。感谢。

2 个答案:

答案 0 :(得分:0)

这对我来说非常好,但是如果所有发布标题都是唯一的并且您想要传递{{get,那么您可能希望在视图函数中使用filter而不是Publication。 1}}而不是查询集(包含一个项目)到详细信息模板中。这会引发错误,即0或> 1匹配,但听起来这可能是你想要的行为

然而,我不确定你在这里错过了什么。 publication_detail.html看起来像什么?您应该在上面的代码中基本上拥有所需的一切来呈现细节,假设它们都包含在相关的Publication实例中。

答案 1 :(得分:0)

如果您使用named url patterns,则可以使用url模板标记轻松完成此操作。

urls.py

url(r'^(?P<detail_type>\w+)/(?P<link_item>\w+)/detail$', get_details, name='details')

模板

{% url 'details' 'publications' publication.title %}

我希望您也了解SlugField,对于网址而言,这比普通CharField要好得多。


替代方案:

urls.py

url(r'^(?P<detail_type>\w+)/(?P<pk>\w+)/detail$', get_details, name='details')

模板

{% url 'details' 'publications' publication.pk %}

views.py

def get_details(request, detail_type=None, pk=None):
    if detail_type == "publications":
        publication = Publication.objects.get(pk=pk)
        return render(request, 'publication_detail.html', {'detail_type' : detail_type, 'publication' : publication})
    elif ....

这使用条目的主键而不是标题。如果您想要一个包含标题的网址,您需要在模型上添加并使用SlugField