如何在Django中的两个不同页面上使用一个视图?

时间:2013-04-29 14:36:02

标签: django django-views django-templates

我正在使用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中生成的菜单列表呢?

1 个答案:

答案 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模板中运行。

希望它有所帮助。