如何在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
相关产品推荐
相关产品推荐

