0

保存从 Django-select2 Widget 中选择的多个选择的正确方法是什么?

这是我的模型

class Rgn_Details(models.Model):

    request_no = models.ForeignKey(Request_Flow, on_delete=models.CASCADE, related_name='request_ref')
    region = models.ForeignKey(Region, on_delete=models.PROTECT, related_name='regn')

    class Meta:
        ordering= ['-region']

    def __str__(self):
        return self.region

我有一个这样的模型。

class RegionForm(forms.ModelForm):
    region = forms.ModelMultipleChoiceField(queryset=Region.objects.all().order_by('region_id'),
                                            widget=Select2MultipleWidget)

    class Meta:
        model = Rgn_Details
        fields = ['region']

这是我的看法

def create(request):

    if  request.method == 'POST':
        form1 = RequestForm(request.POST, prefix="form1")
        form2 = RegionForm(request.POST, prefix="form2")


        if form1.is_valid() and form2.is_valid():
            req = form1.save()
            region = form2.save(commit=False)
            region.request_no = req 
            region.save()

如果我尝试region.save()它不起作用虽然表单验证没有错误...

我正进入(状态

Cannot insert the value NULL into column 'region_id', table 'rgn_details'

当您使用 Django-Select2 小部件进行多项选择时,我的保存方法是否有问题?

4

2 回答 2

0

这是我用来存储表单中选择的多个数据的解决方案......

不确定任何可用的内置解决方案,但这对我有用..

for _region in form2.cleaned_data['region']:
            region = Rgn_Details(region=_region, request_no=req)
            region.save()

由于我没有使用 ModelForm 的功能,我将我的表单从 ModelForm 更改为常规表单

class RegionForm(forms.Form):
    region = forms.ModelMultipleChoiceField(queryset=Region.objects.all().order_by('region_id'),
                                            widget=Select2MultipleWidget)

    class Meta:
        #model = Rgn_Details
        fields = ['region']
于 2020-05-12T19:22:48.180 回答
0

当你这样做时,commit=FalseDjango 也需要你添加save_m2m()。所以你的代码:

if form1.is_valid() and form2.is_valid():
            req = form1.save()
            region = form2.save(commit=False)
            region.request_no = req 
            region.save()

应该改为:

if form1.is_valid() and form2.is_valid():
            req = form1.save()
            region = form2.save(commit=False)
            region.request_no = req
            form2.save_m2m()
            region.save()

来自Django 文档

仅当您使用 save(commit=False) 时才需要调用 save_m2m()。当您在表单上使用 save() 时,所有数据(包括多对多数据)都会被保存,而无需任何额外的方法调用。

于 2021-07-09T12:30:12.957 回答