Сохранение ManyToManyFields с использованием ModelForms - PullRequest
1 голос
/ 08 июля 2019

Я очень новичок в Джанго.Я пытаюсь создать приложение Django.Имеет модели портов и внутренних приложений.Я использую ModelForm для создания записи Internalapp.Однако проблема заключается в том, что порты во внутренней версии приложения - это ManyToManyField.Когда я создаю новую запись internalapp, поле портов (ManyToManyField) не сохраняет данные в базу данных. Ниже я предоставляю мои фрагменты кода modles.py, forms.py и views.py.Любая помощь будет принята.

models.py

         class portList(models.Model):

                PROTOCOL = (("tcp","TCP"),("udp","UDP"),("icmp","ICMP"))

                appName =  models.CharField(max_length=50)
                serviceName = models.CharField(max_length=50)
                protocol = models.CharField(max_length=10, choices=PROTOCOL, default= "TCP")
                reviewDt = models.DateField(default=date.today) 
                status = models.CharField(max_length=20,null=True)

                def __str__(self):
                    return self.serviceName

            class internalapp(models.Model):
                PERIMETER_DOM = (("All","All"),("ECN","ECN"),("GIZ","GIZ"),)
                plAppConfig  = models.CharField('PaloAlto Application Config',max_length=1000, blank=False, null=True)
                comment   = models.CharField('Comments',max_length=500, blank=False, null=True)
                createdDt = models.DateField('Creation Date',default=date.today)                             # Automatically set the field to now when the object is first created. 
                ports = models.ManyToManyField(portList,blank=True)

                def __str__(self):
                    return self.servGrpNm

forms.py

            class InternalappModelForm(forms.ModelForm):
                groupInd = forms.IntegerField(label='Group Index',min_value=0)
                appGrpNm = forms.CharField(label='Application Group Name',help_text="This field consists of Perimeter Dom, Group Index and Appliction Function name" )
                servGrpNm = forms.CharField(label='Service Group Name',help_text="This field consists of Perimeter Dom, Group Index and Appliction Function name")
                comment = forms.CharField(widget=forms.Textarea(attrs={'cols': 50, 'rows': 3}),required=False)
                ports = forms.ModelMultipleChoiceField(queryset=portList.objects.all(),required=False)
                class Meta:
                    model=internalapp
                    fields = ['appGrpNm',
                              'servGrpNm',
                              'perimeter',
                              'groupInd',
                              'appGrpFunc',
                              'comment',
                              'ports']

views.py

            def new_create(request):
                if request.method == 'POST':
                    form = InternalappModelForm(request.POST)
                    if form.is_valid():
                        appObj= internalapp()
                        appObj = form.save()
                        return redirect('home')
                else:
                    form = InternalappModelForm()
                    print(request.POST)
                return render(request,'crud/created.html', {'form': form})

1 Ответ

1 голос
/ 08 июля 2019

Вам нужно вручную сохранить отношения многие ко многим

if form.is_valid():
    appObj = form.save()
    appObj.ports.add(*form.cleaned_data['ports'])
    return redirect('home')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...