我是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 ....
就像我说的,我是一个非常初学者,所以如果我以错误的方式接近这个,任何建议或资源都会受到赞赏。感谢。
答案 0 :(得分:0)
这对我来说非常好,但是如果所有发布标题都是唯一的并且您想要传递{{get
,那么您可能希望在视图函数中使用filter
而不是Publication
。 1}}而不是查询集(包含一个项目)到详细信息模板中。这会引发错误,即0或> 1匹配,但听起来这可能是你想要的行为
然而,我不确定你在这里错过了什么。 publication_detail.html
看起来像什么?您应该在上面的代码中基本上拥有所需的一切来呈现细节,假设它们都包含在相关的Publication实例中。
答案 1 :(得分:0)
如果您使用named url patterns,则可以使用url
模板标记轻松完成此操作。
url(r'^(?P<detail_type>\w+)/(?P<link_item>\w+)/detail$', get_details, name='details')
{% url 'details' 'publications' publication.title %}
我希望您也了解SlugField
,对于网址而言,这比普通CharField
要好得多。
替代方案:
url(r'^(?P<detail_type>\w+)/(?P<pk>\w+)/detail$', get_details, name='details')
{% url 'details' 'publications' publication.pk %}
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
。