如何在Django FilterView中复用学年筛选功能?
实现学年选择功能复用至FilterView
问题背景
已有基于函数的视图home_selected可通过URL传入的year参数展示对应学年数据,现需让FilteredLearnerListView(继承FilterView)实现相同逻辑,根据选中的学年过滤学员数据,而非固定展示当前学年内容。
解决方案
1. 修改FilteredLearnerListView,动态接收year参数过滤数据
原视图中类属性级别的查询逻辑会在服务器启动时执行,无法获取请求中的动态参数,需将过滤逻辑移至get_queryset方法中,以获取URL传入的year参数:
from django.shortcuts import get_object_or_404 from django.views.generic import FilterView from django_tables2.views import SingleTableMixin class FilteredLearnerListView(SingleTableMixin, FilterView): table_class = LearnerTable model = Learner context_object_name = "learner_list" template_name = "learner_list.html" filterset_class = LearnerFilter def get_queryset(self): # 从URL参数中提取选中的学年 selected_year = self.kwargs.get('year') # 根据年份获取对应AcademicYear记录(若年份无效返回404) academic_year = get_object_or_404(AcademicYear, year=selected_year) # 过滤该学年下的合同ID contract_ids = Contract.objects.filter(academic_year=academic_year).values_list("id", flat=True) # 过滤对应合同下的组 target_groups = Group.objects.filter(contractId__in=contract_ids) # 返回该学年下的学员查询集 return Learner.objects.filter(groupId__in=target_groups)
注:若
AcademicYear存储年份的字段不是year,请替换为实际字段名(如name);使用get_object_or_404可避免无效年份导致的服务器错误。
2. 调整下拉菜单的URL指向(适配多页面)
要让下拉菜单在不同页面点击时,跳转到对应视图的学年页面,可在base.html中根据当前视图动态生成URL:
<div class="dropdown"> <a href="#" class="d-flex align-items-center text-white text-decoration-none dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"> <svg class="bi pe-none me-2" width="16" height="16"><use xlink:href="#archive"/></svg> <strong>Select Year</strong> </a> <ul class="dropdown-menu dropdown-menu-dark text-small shadow"> {% for year in years %} {% if request.resolver_match.url_name == 'administration.home_selected' %} <li><a class="dropdown-item" href="{% url 'administration.home_selected' year %}">{{year}}</a></li> {% elif request.resolver_match.url_name == 'administration.learners' %} <li><a class="dropdown-item" href="{% url 'administration.learners' year %}">{{year}}</a></li> {% endif %} {% endfor %} </ul> </div>
3. 导航跳转时携带当前学年(可选)
若需在home_selected.html点击导航到学员列表时,自动携带当前选中的学年,需在函数视图中传入当前年份到上下文:
# views.py中的home_selected函数视图 def home_selected(request, year): # 原有业务逻辑... # 将当前选中的年份传入模板上下文 context = { 'current_year': year, # 其他上下文变量... } return render(request, 'home_selected.html', context)
然后在home_selected.html的导航链接中使用该参数:
<a href="{% url 'administration.learners' current_year %}" class="nav-link">学员列表</a>
内容的提问来源于stack exchange,提问作者Lisa Higgins
相关产品推荐
相关产品推荐

