You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django视图上下文中传入动态URL以复用子模板?

解决Django动态传入列表URL复用子模板的问题

方法1:视图中用reverse生成URL直接传入

Django的reverse函数可通过视图名称直接生成对应URL,无需在上下文里写模板标签,直接在视图代码生成后传入即可。

示例视图代码:

from django.urls import reverse
from django.views.generic import DetailView
from .models import Teacher

class TeacherDetailView(DetailView):
    model = Teacher
    template_name = 'teacher_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 生成teacher-list的URL并传入上下文
        context['list_url'] = reverse('teacher-list')
        context['list_title'] = '教师列表'
        return context

在page_title.html子模板中直接调用变量:

<a href="{{ list_url }}">{{ list_title }}</a>

方法2:子模板中接收视图名称动态生成URL

如果不想在每个视图里写reverse,可以在视图中传入视图名称变量,在子模板里用{% url %}标签动态生成URL。

视图代码示例:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['list_view_name'] = 'teacher-list'
    context['list_title'] = '教师列表'
    return context

page_title.html子模板代码:

<a href="{% url list_view_name %}">{{ list_title }}</a>

这种方式更灵活,无需在视图中处理URL生成逻辑,直接传递视图名称给子模板即可。

方法3:用Mixin复用上下文逻辑

若多个视图都需要传入这类变量,可以编写Mixin类,彻底避免重复代码:

Mixin类代码:

from django.urls import reverse

class ListTitleUrlMixin:
    list_view_name = None
    list_title = None

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if self.list_view_name:
            context['list_url'] = reverse(self.list_view_name)
        context['list_title'] = self.list_title
        return context

视图中继承该Mixin:

class TeacherDetailView(ListTitleUrlMixin, DetailView):
    model = Teacher
    template_name = 'teacher_detail.html'
    list_view_name = 'teacher-list'
    list_title = '教师列表'

后续其他视图只需设置对应的list_view_name和list_title属性,就能自动传入所需上下文变量。

内容的提问来源于stack exchange,提问作者Dylan Bergmann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:32:39