Django m2m form save “ through ” table

前端 未结 4 650
春和景丽
春和景丽 2020-11-28 09:15

I\'m having trouble in saving a m2m data, containing a \'through\' class table. I want to save all selected members (selected in the form) in the through table. But i don\'t

4条回答
  •  生来不讨喜
    2020-11-28 09:53

    In case of using normal m2m relation (not through intermediary table) you could replace:

    membership = Membership(member = HERE SELECTED ITEMS FROM FORM,classroom=new_obj)
    membership.save()
    

    with

    form.save_m2m()
    

    But in case of using intermediary tables you need to manually handle POST data and create Membership objects with all required fields (similar problem). The most basic solution is to change your view to something like:

    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())
    

    Note how request.POST is manipulated (.getlist). This is because post and get are QueryDict objects which has some implications (request.POST['members'] will return always one object!).

    You can modify this code to get it more reliable (error handling etc.), and more verbose, eg:

    member = get_object_or_404(User, pk = member_id)
    membership = Membership.objects.create(member = member , classroom = new_obj)
    

    But note that you are performing some db queries in a loop which is not a good idea in general (in terms of performance).

提交回复
热议问题