首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-select2 2存储多重选择

django-select2 2存储多重选择
EN

Stack Overflow用户
提问于 2020-05-09 03:30:41
回答 2查看 1.7K关注 0票数 0

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

这是我的模型

代码语言:javascript
复制
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

我有这样一个模特儿。

代码语言:javascript
复制
class RegionForm(forms.ModelForm):
    region = forms.ModelMultipleChoiceField(queryset=Region.objects.all().order_by('region_id'),
                                            widget=Select2MultipleWidget)

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

这是我的观点

代码语言:javascript
复制
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 2小部件有多个选择时,我是否对保存方法做了错误?

EN

回答 2

Stack Overflow用户

发布于 2020-05-12 19:22:48

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

不确定是否有内置的解决方案,但这对我是有用的。

代码语言:javascript
复制
for _region in form2.cleaned_data['region']:
            region = Rgn_Details(region=_region, request_no=req)
            region.save()

由于我没有利用ModelForm的特性,所以我将表单从ModelForm改为正则表单

代码语言:javascript
复制
class RegionForm(forms.Form):
    region = forms.ModelMultipleChoiceField(queryset=Region.objects.all().order_by('region_id'),
                                            widget=Select2MultipleWidget)

    class Meta:
        #model = Rgn_Details
        fields = ['region']
票数 0
EN

Stack Overflow用户

发布于 2021-07-09 12:30:12

commit=False时,Django也需要添加save_m2m()。所以你的代码:

代码语言:javascript
复制
if form1.is_valid() and form2.is_valid():
            req = form1.save()
            region = form2.save(commit=False)
            region.request_no = req 
            region.save()

应改为:

代码语言:javascript
复制
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()

来自姜戈博士

只有在使用save_m2m(commit=False)时才需要调用commit=False()。当对表单使用save()时,所有数据--包括多到多个数据--都是保存的,而不需要任何额外的方法调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61691426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档