Search code examples
djangodjango-modelsdjango-formsdjango-viewsmanytomanyfield

How to create a new manytomany object and save it to a model in one view


I have a model repairOrders with 2 manytomany fields:

class RepairOrder(models.Model):
    >>>
    labor = models.ManyToManyField(Labor)
    parts = models.ManyToManyField(Parts)

I have the repairOrder displayed and have a button to create a new labor object by using the Labor modelForm. what I want to happen is after I create that obj I want it added to the manytomany field of the RepairOrder. how do I define that in the view?

this is what I have now:

def repairOrder_detail(request, pk):
    if request.method == "POST":
        form = laborForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()
            return redirect('repairOrder_detail', pk=pk)
    else:
        repairs = get_object_or_404(RepairOrder, pk=pk)
        form = repairOrderForm()
        labor = laborForm()
    return render(request, 'repairOrders/repairOrder_detail.html', {'repairs': repairs, 'form': form, 'labor': labor})

Right now I can create as many labor obj as I want but they are not added to the repairOrder model. I don't know what I need to call to save the labor instance to the repairOrder.labor field. I would like for this all to happen in one step for the end user.


Solution

  • You should get the RepairOrder instance first, not in the else statement. Then you can add Labor objects to it.

    def repairOrder_detail(request, pk):
        form = laborForm(request.POST or None)
        form = repairOrderForm()
        repairs = get_object_or_404(RepairOrder, pk=pk)
        if request.method == "POST":
            if form.is_valid():
                post = form.save(commit=False)
                post.save()
    
                repairs.labor.add(post) # <- NEW
    
                return redirect('repairOrder_detail', pk=pk)
    
        return render(request, 'repairOrders/repairOrder_detail.html', 
                      {'repairs': repairs, 'form': form, 'labor': labor})