📌  相关文章
📜  如何在 django 站点中保存多个选择:stackoverflow.com - Python (1)

📅  最后修改于: 2023-12-03 15:24:09.664000             🧑  作者: Mango

如何在Django站点中保存多个选择:stackoverflow.com - Python

在Django站点中,我们常常需要保存用户的多个选择,例如选课系统中,一个学生可以选择多门课程。这时,我们可以使用多对多关系来实现。

定义多对多关系

首先,在models.py中定义多对多关系:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=50)
    courses = models.ManyToManyField(Course) # 多对多关系

class Course(models.Model):
    name = models.CharField(max_length=50)

在上面的代码中,我们定义了两个模型:Student和Course,它们之间建立了多对多关系。

添加和删除关系

为了添加和删除关系,我们可以使用add()和remove()方法。例如,我们可以在views.py中添加一个选课的视图:

from django.shortcuts import render, get_object_or_404
from .models import Student, Course

def select_course(request, student_id):
    student = get_object_or_404(Student, pk=student_id)
    courses = Course.objects.all()

    if request.method == 'POST':
        selected_courses = request.POST.getlist('courses')
        student.courses.set(selected_courses)
        student.save()

    return render(request, 'select_course.html', {'student': student, 'courses': courses})

在上面的代码中,我们首先获取当前学生对象student和所有课程courses。当用户提交表单时,我们使用request.POST.getlist()方法获取所有选中的课程,使用set()方法更新学生选择的课程,并保存学生对象。最后,我们渲染select_course.html模板并传递学生对象和所有课程给模板。

在select_course.html模板中,我们可以使用Django表单和循环来生成多个复选框来让学生选择课程:

<form method="post">
  {% csrf_token %}
  {% for course in courses %}
    <input type="checkbox" name="courses" value="{{ course.id }}"
      {% if course in student.courses.all %} checked {% endif %}>
    {{ course.name }}<br>
  {% endfor %}
  <input type="submit" value="Save">
</form>

在上面的代码中,我们使用for循环生成多个复选框,选择的课程使用student.courses.all()获取。选项被选中时,使用if语句判断是否已经选择。最后,我们在表单中添加一个保存按钮。

通过以上步骤,我们就能够在Django站点中保存多个选择了。