我正在使用Django 1.5.1构建一个站点。我定义了相册和类别模型:
###models.py
class Category(models.Model):
title = models.CharField(max_length=200, unique=True)
class Album(models.Model):
category = models.ForeignKey(Category, related_name='albums')
我已经生成了一个菜单,可以使用此视图和模板自动列出类别及其相关相册:
###views.py
def index(request):
categories = Category.objects.all()[:5]
context = {'categories': categories}
return render(request, 'gallery/index.html', context)
def detail(request, album_id):
album = get_object_or_404(Album, pk=album_id)
return render(request, 'gallery/detail.html', {'album': album})
###index.html
{% for category in categories %}
{% with category.albums.all as albums %}
{{ category.title }}
{% if albums %}
{% for album in albums %}
<a href="/gallery/{{ album.id }}/">{{ album.title }}</a><br>
{% endfor %}
{% endif %}
{% endwith %}
{% endfor %}
<a href="blah">Biography</a>
我还可以将每个专辑显示为一个画廊指示给detail.html。我想在每个图库旁边显示菜单列表,因此我在detail.html的开头使用了{% include "gallery/index.html" %}
标记。但是当detail.html加载时,菜单列表不会显示,我只看到传记固定链接。
以下是我的问题:我应该如何在detail.html中导入index.html中生成的菜单列表呢?
答案 0 :(得分:3)
index.html
期望收到categories
变量以创建菜单。如果要将其包含在其他模板中,则必须将categories
变量传递给所包含的另一个模板。如果您与名称存在冲突,您还可以将变量传递到include
标记,如下所示:
{% include 'include_template.html' with foo=bar%}
因此,包含的模板可以使用值为foo
的变量bar
。
例如,您需要将categories
变量传递给为detail.html
生成的上下文,如下所示:
def detail(request, album_id):
categories = Category.objects.all()[:5]
album = get_object_or_404(Album, pk=album_id)
return render(request,
'gallery/detail.html',
{'album': album,
'categories':categories}
)
index.html
模板中包含detail.html
模板的行应该保留在问题中:
{% include "gallery/index.html" %}
我刚才做的是传递categories
所需的index.html
变量,用于将菜单呈现给detail.html
模板,而index.html
模板又会将其传递给所有包含的模板({{ 1}})。
这应该让菜单在detail.html
模板中运行。
希望它有所帮助。