В случае использования нормального отношения m2m (не через промежуточную таблицу) вы можете заменить:
membership = Membership(member = HERE SELECTED ITEMS FROM FORM,classroom=new_obj)
membership.save()
с
form.save_m2m()
Но в случае использования промежуточных таблиц вам нужно вручную обрабатывать данные POST и создавать объекты Membership со всеми обязательными полями ( аналогичная проблема ). Самое основное решение состоит в том, чтобы изменить ваш взгляд на что-то вроде:
def save_classroom(request):
if request.method == 'POST':
form = ClassroomForm(request.POST, request.FILES)
if form.is_valid():
new_obj = form.save(commit=False)
new_obj.user = request.user
new_obj.save()
for member_id in request.POST.getlist('members'):
membership = Membership.objects.create(member_id = int(member_id), classroom = new_obj)
return HttpResponseRedirect('/')
else:
form = ClassroomForm()
return render_to_response('save_classroom.html', locals())
Обратите внимание, как обрабатывается request.POST (.getlist). Это потому, что post и get являются QueryDict объектами, которые имеют некоторые последствия (request.POST ['members'] всегда будет возвращать один объект!).
Вы можете изменить этот код, чтобы сделать его более надежным (обработка ошибок и т. Д.) И более подробным, например:
member = get_object_or_404(User, pk = member_id)
membership = Membership.objects.create(member = member , classroom = new_obj)
Но обратите внимание, что вы выполняете некоторые дБ-запросы в цикле, что не очень хорошая идея в целом (с точки зрения производительности).