简体   繁体   中英

Django relationship in manyToMany models, object has no attribute

I have a problem with creating relationship in m2m models.

models.py

class ECG(models.Model):
    procedure= models.ManyToManyField('Procedure')
    ...
class Procedure(models.Model):
    basic_info= models.IntegerField(default=0)

views.py

def newECG(request, procedure_id):
    if request.method == 'POST':
        form = NewECG(request.POST)
        if form.is_valid():
            form.save()
            info = IncomingProcedure.objects.get(id=procedure_id)
            form.procedure.add(info) #HERE IS A PROBLEM
            return HttpResponseRedirect('/system/')
    else:
        form = NewECG()
    return render(request, 'system/ecg.html', {'form': form})

forms.py

class NewECG(ModelForm):
    class Meta:
        model = ECG
        exclude = ['procedure']
        # fields = '__all__'
        fields = [ ... ] # rest fields, except procedure

Procedure already exists. I need to create newECG in relation with procedure. ECG form is saving in db. Problem is when i want to use add() function.

ERROR :'NewECG' object has no attribute 'procedure', exception location: views.py

The ModelForm instance does not have the procedure attribute that is defined on the model. The ECG model instance, however, which is returned by the form's save(...) method, does have it:

ecg_instance = form.save()
info = IncomingProcedure.objects.get(id=procedure_id)
# info = Procedure.objects.get(id=procedure_id)
ecg_instance.procedure.add(info)

You just forgot a step:

def newECG(request, procedure_id):
    if request.method == 'POST':
        form = NewECG(request.POST)
        if form.is_valid():
            ecg = form.save()
            info = IncomingProcedure.objects.get(id=procedure_id)
            ecg.procedure.add(info) #HERE IS A PROBLEM
            return HttpResponseRedirect('/system/')

I can't understand why you are trying to add IncomingProcedure.objects to your from in views.py

If you want save it on your database, Should simply do this:

views.py

# ... Your codes:
M = form.save()  # save your class instance to M variable
info = IncomingProcedure.objects.get(id=procedure_id)
M.procedure.add(info) # save procedure instance to your object(An ECG model instance)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM