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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:21:04