1

我正在使用 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 指示的视图。我想在每个画廊旁边显示菜单列表,所以我 {% include "gallery/index.html" %}在 detail.html 的开头使用了标签。但是当 detail.html 加载时菜单列表没有显示,我只看到传记固定链接。

这是我的问题:我应该如何导入 index.html 中生成的菜单列表 in detail.html 呢?

4

1 回答 1

3

index.html期望接收categories变量以创建菜单。如果要将其包含在其他模板中,则必须将categories变量传递给包含模板的其他模板。如果您与名称有一些冲突,您还可以将变量传递给include标签,如下所示:

{% include 'include_template.html' with foo=bar%}

所以包含的模板可以使用foo具有 value的变量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.htmldetail.htmlindex.html

这应该让菜单在detail.html模板中工作。

希望能帮助到你。

于 2013-04-29T14:49:40.403 回答