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

如何通过模型字段在HTML中筛选?能否用自定义模板标签按学期拆分科目?

解决方案

完全可以实现你的需求,甚至不用自己写自定义标签——Django内置的{% regroup %}标签就能完美解决按学期分组展示科目的问题。如果一定要自定义模板标签或过滤器,也很容易实现,下面给你两种可行方案:

方案1:使用Django内置的{% regroup %}标签(推荐)

这个标签专门用来将列表按指定字段分组,最适合你的场景。

步骤:

  1. 视图层:查询该课程下的所有科目,并按学期排序(regroup要求列表提前按分组字段排序,否则会出现同一学期的科目被拆分到多个组的情况):
# views.py
from django.shortcuts import render
from .models import Subject

def subject_checklist(request, course_id):
    subjects = Subject.objects.filter(course_id=course_id).order_by('semester')
    return render(request, 'subject_checklist.html', {'subjects': subjects})
  1. 模板层:用regroup分组后渲染每个学期的div:
<!-- subject_checklist.html -->
{% regroup subjects by semester as semester_groups %}

{% for semester_group in semester_groups %}
  <div class="semester-container">
    <h2>第{{ semester_group.grouper }}学期</h2>
    {% for subject in semester_group.list %}
      <label class="subject-item">
        <input type="checkbox" 
               name="completed_subjects" 
               value="{{ subject.id }}"
               {% if subject.is_completed %}checked{% endif %}>
        {{ subject.name }}
      </label>
    {% endfor %}
  </div>
{% endfor %}
  • semester_group.grouper:表示当前分组的学期值(比如1、2、3)
  • semester_group.list:该学期下的所有科目列表

方案2:自定义模板过滤器

如果需要更灵活的分组逻辑,可以自己写一个过滤器来实现分组。

步骤:

  1. 创建模板标签文件:在你的app目录下创建templatetags文件夹(如果没有的话),然后新建subject_filters.py:
# yourapp/templatetags/subject_filters.py
from django import template

register = template.Library()

@register.filter
def group_by_semester(subjects):
    # 初始化分组字典
    grouped_subjects = {}
    for subject in subjects:
        semester = subject.semester
        # 如果该学期不在字典中,创建空列表
        if semester not in grouped_subjects:
            grouped_subjects[semester] = []
        # 将科目添加到对应学期的列表
        grouped_subjects[semester].append(subject)
    # 按学期号排序,保证顺序从第1学期到最后一学期
    return sorted(grouped_subjects.items(), key=lambda x: x[0])
  1. 模板层使用过滤器:先加载自定义过滤器,再分组渲染:
<!-- subject_checklist.html -->
{% load subject_filters %}

{% for semester, subjects_in_semester in subjects|group_by_semester %}
  <div class="semester-container">
    <h2>第{{ semester }}学期</h2>
    {% for subject in subjects_in_semester %}
      <label class="subject-item">
        <input type="checkbox" 
               name="completed_subjects" 
               value="{{ subject.id }}"
               {% if subject.is_completed %}checked{% endif %}>
        {{ subject.name }}
      </label>
    {% endfor %}
  </div>
{% endfor %}

注意事项

  • 无论用哪种方案,都建议在视图层对科目列表按学期排序,避免出现同一学期的科目分散展示的情况。
  • 如果你的学期不是数字(比如"秋学期"、"春学期"),只需调整排序逻辑即可(比如在order_by里用对应字段,或者自定义过滤器的排序key)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:05:19