在Django中使用复选框和查询数据库

在Django中使用复选框和查询数据库,django,forms,Django,Forms,我的目标是创建一个页面,列出数据库中所有可用的课程,并让用户选择他们想成为导师的课程 我有一个CustomUser模型,一个courses模型,最后还有一个tutorteachesorse模型,它将user和courses作为外键 # model.py from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): is_tutee = models.BooleanField(defa

我的目标是创建一个页面,列出数据库中所有可用的课程,并让用户选择他们想成为导师的课程

我有一个
CustomUser
模型,一个
courses
模型,最后还有一个
tutorteachesorse
模型,它将
user
courses
作为外键

# model.py

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
  is_tutee = models.BooleanField(default=False)
  is_tutor = models.BooleanField(default=False)
  courses = models.ManyToManyField(Courses)

class Courses(models.Model):
  course_name = models.CharField(max_length=100, null = False)
  course_number = models.CharField(max_length=100, null = False)
  department = models.ForeignKey(Department, on_delete=models.CASCADE)
  course_description = models.CharField(max_length=1000, blank=True)
  #tutor = models.ManyToManyField(CustomUser) #moved m2m relationship to user model
  objects = models.Manager()

  def __str__(self):
    return self.course_name
在这里,用户可以选择/取消选择他们想辅导/不想辅导的课程

# edit_tutored_courses.html
<table style="width:50%">
<tr>
  <th>Course Name</th>
</tr>
<form method="POST" action="">
{% csrf_token %}
{% for is_tutor in form %}
{% for course in is_tutor %}
<tr>
  <td>{{ course }}</td>
  <td>{{ user }}</td>
</tr>
{% endfor %}
{% endfor %}

</table>
<input type="submit" value="Save Changes"/>
</form>
\edit\u tutored\u courses.html
课程名称
{%csrf_令牌%}
{%for is_tutor的格式为%}
{is_tutor%}中的课程为%
{{course}}
{{user}}
{%endfor%}
{%endfor%}

我可以在我的页面上显示课程,但我不知道如何更改数据库。我希望复选框意味着,一旦我单击“提交”,表
tutorteachesources
就会用选中的课程填充该用户,如果我取消选中复选框,则意味着它会删除现有的课程。(这意味着我还需要让页面自动选中数据库中存在的复选框。我如何做到这一切?

那么,有什么问题吗?使用常规的
表单
(而不是
模型表单
)使用和
复选框SelectMultiple
小部件。您需要更改模板以显示该字段,而不是在课程中循环。然后在您的视图中,字段清理数据的值将是课程列表,因此您可以创建您的关系。请注意,您可以刚刚定义
ManyToManyField
Course
上转到
CustomUser
而不是创建单独的模型。
如果form.is\u valid():user.courses.set(form.cleaned\u data['courses']
是分配所选课程所需的全部操作。向模型添加一个u str\uu()方法。这就是用于打印对象的方法。
# views.py
def edit_tutored_courses(request):
  user = request.user
  if request.method == 'POST':
    form = EditTutoredCoursesForm(request.POST)
    if form.is_valid():
      user.courses.set(form.cleaned_data['courses'])
      user = form.save(commit=True)
      messages.success(request, 'Success!')
    return redirect(reverse('view_profile'))
  else:
    form = EditTutoredCoursesForm()
  context = {
    'form' : form,
  }
  return render(request, 'edit_tutored_courses.html', context)
# edit_tutored_courses.html
<table style="width:50%">
<tr>
  <th>Course Name</th>
</tr>
<form method="POST" action="">
{% csrf_token %}
{% for is_tutor in form %}
{% for course in is_tutor %}
<tr>
  <td>{{ course }}</td>
  <td>{{ user }}</td>
</tr>
{% endfor %}
{% endfor %}

</table>
<input type="submit" value="Save Changes"/>
</form>