Django多对多关联模型下学生表单取模块列表及关联查询方法
问题1:新增学生表单获取全量Module并实现关联
你定义的多对多关联字段在Module模型侧,Django会自动为Student生成反向关联能力,按以下步骤操作即可:
- 定义Student表单时,新增Module多选字段,自动加载全量已有Module:
from django import forms from .models import Student, Module class StudentAddForm(forms.ModelForm): # 自动查询所有Module作为可选项 selected_modules = forms.ModelMultipleChoiceField( queryset=Module.objects.all(), widget=forms.CheckboxSelectMultiple, # 复选框形式更适合多选,可按需替换组件 label="选修课程" ) class Meta: model = Student fields = ["student_id", "name", "birthday"]
- 视图层保存表单时,手动写入多对多关联:
def add_student(request): if request.method == "POST": form = StudentAddForm(request.POST) if form.is_valid(): # 先保存学生基础信息 student = form.save() # 关联选中的Module student.module_set.add(*form.cleaned_data["selected_modules"]) return redirect("student_list") # 替换为你自己的跳转路由名 else: form = StudentAddForm() return render(request, "add_student.html", {"form": form})
问题2:查询学生关联的所有Module
无需修改现有模型的查询方式
直接用Django默认生成的反向关联属性module_set查询即可:
# 先获取指定学生的实例 student = Student.objects.get(student_id="0001") # 查询关联的所有Module student_modules = student.module_set.all()
语义化优化方案(可选)
可以调整Module模型的多对多字段配置,添加related_name参数自定义反向关联名称,使用更直观:
class Module(models.Model): name = models.CharField(max_length=150) code = models.IntegerField() # 添加related_name参数 student = models.ManyToManyField(Student, related_name="enrolled_modules")
修改后查询代码可简化为:
student_modules = student.enrolled_modules.all()
模板页面展示示例
将查询到的数据集传到模板后,循环渲染即可:
<div> <h3>{{ student.name }}的选修课程</h3> <ul> {% for mod in student_modules %} <li>课程名称:{{ mod.name }} / 课程代码:{{ mod.code }}</li> {% empty %} <li>暂无选修课程</li> {% endfor %} </ul> </div>
内容的提问来源于stack exchange,提问作者Ibtasum Iktadar
相关产品推荐
相关产品推荐

