Присвоение объектов отношениям "многие-ко-многим" - Django
У меня есть проект django, где у меня есть список с флажками, чтобы выбрать и назначить студентов преподавателям. Я прикрепил свой код ниже - я не получаю ошибок, но, похоже, он не назначает студента в поле "students" many-to-many в моей модели "teachers".
У меня есть функция GET, которая вызывается ранее для выбора учителя, затем она должна извлечь эту запись GET и назначить ученика этому учителю.
Есть идеи?
Views.py
if 'assign_student' in request.POST:
form = StudentForm(request.POST)
selected = request.GET['select_teacher']
selected_teacher = Teacher.objects.all().filter(pk=selected)[0]
if form.is_valid():
student_selected = request.POST('assign_student')
student = Student.objects.all().filter(pk=student_selected)[0]
selected_teacher.students.add(*student)
Template.html
<div class="student-list">
{% for instance in all_students %}
<div class="input-group" style="border-bottom: 1px solid;">
<div class="item-details">
<div class="form-check">
<form method="POST" class="form-group" name="assign_student">
{% csrf_token %}
<input onChange="this.form.submit()" class="form-check-input" type="checkbox" value={{ instance.pk }} id="flexCheckDefault" name="assign_student">
</form>
<p>
<b>{{ instance.fullname }}</b>
<br>
{{ instance.homeschool }} - {{ instance.schoolclass }} Class
</p>
</div>
</div>
</div>
{% endfor %}
</div>
Причина, по которой он не работает, заключается в том, что вы используете запросы с помощью фильтров и т.д. Таким образом, вам возвращается набор запросов вместо объекта.
Вместо этого вам следует использовать get_object_or_404()
.
Кроме того, вы сохраняете данные для сессии, а не в базе данных. Вы должны использовать students.save()
для сохранения в БД.
Вы можете сделать что-то вроде этого
from django.shortcuts import get_object_or_404
if 'assign_student' in request.POST:
form = StudentForm(request.POST)
selected = request.GET['select_teacher']
selected_teacher = get_object_or_404(Teacher, pk=selected)
if form.is_valid():
student_selected = request.POST('assign_student')
student = get_object_or_404(Student, pk=student_selected)
selected_teacher.students.add(student)
selected_teacher.save() #saving the teacher model object
selected_teacher.students.save() #saving the student model object
Ах я глупый!
Я исправил это, я пытался получить "if form.is_valid()", когда я не размещаю полную форму - удалил это и все работает сейчас.