【问题标题】:MultipleChoiceField create multiple objectsMultipleChoiceField 创建多个对象
【发布时间】:2017-09-21 06:41:20
【问题描述】:

我在表单中使用 MultipleChoiceField。我想将所有选定的值添加到数据库,但我使用的下一个代码只添加用户选择的最后一个值。我尝试在我的视图中创建多个数字对象。我哪里做错了?

models.py:

class Requirement(models.Model):
    code = models.UUIDField(_('Code'), primary_key=True, default=uuid.uuid4, editable=False)
    symbol = models.CharField(_('Symbol'), max_length=250)
    name = models.CharField(_('Name'), max_length=250)

forms.py:

class AddForm(forms.ModelForm):
    symbol= forms.MultipleChoiceField(required=False, widget=forms.CheckboxSelectMultiple, choices=REQUIREMENTS_CHOICES,)

    class Meta:
        model = Requirement
        fields = ('symbol',)


REQUIREMENTS_CHOICES = (
    ('A', 'Name A'),
    ('B', 'Name B'),
    ('C', 'Name C'),
)

views.py:

def requirement_add(request):
    data = dict()
    if request.method == 'POST':
        form = AddForm(request.POST)
        if form.is_valid():
            list = dict(REQUIREMENTS_CHOICES) # {'C': 'Name C', 'A': 'Name A', 'B': 'Name B'}
            symbols = form.cleaned_data.get('symbol') # ['A', 'B', 'C']
            requirement = form.save(commit=False)
            for symbol in symbols:
                requirement.symbol = symbol
                requirement.name = list[symbol]
                requirement.save()
            data['form_is_valid'] = True
            requirements = Requirement.objects.filter()
            context = {requirement': requirement, 'requirements': requirements}
            data['html_requirement'] = render_to_string('project/requirement_list.html', context)
        else:
            data['form_is_valid'] = False
    else:
        form = AddForm()
    context = {'form': form}
    data['html_requirement_form'] = render_to_string('project/requirement_add.html', context, request=request)
    return JsonResponse(data)

【问题讨论】:

    标签: python django algorithm python-3.x django-1.10


    【解决方案1】:

    您应该添加requirement.pk = None,以便每次调用save 都会在数据库中插入一个新行:

    for symbol in symbols:
        requirement.symbol = symbol
        requirement.name = group_requirement_list[symbol]
        requirement.pk = None
        requirement.save()
    

    在此处查看文档https://docs.djangoproject.com/en/dev/ref/models/instances/#how-django-knows-to-update-vs-insert

    编辑:

    说明:在此循环的第一次迭代中,requirement.save() 将按照您的预期在数据库中插入一个新行。但在那之后requirement 将拥有新行的主键,Django 将尝试更新它而不是创建一个新行。

    替代解决方案:如果您将 requirement = form.save(commit=False) 像这样放在 for 循环中,您可以避免所有这些:

    symbols = form.cleaned_data.get('symbol') # ['A', 'B', 'C']
    for symbol in symbols:
        requirement = form.save(commit=False)
        requirement.symbol = symbol
        requirement.name = group_requirement_list[symbol]
        requirement.save()
    

    【讨论】:

    • 谢谢! requirement.pk = None 为我工作,但我不明白为什么它有效 xD 你能解释一下吗?如您所见,代码字段是我的 pk,我也使用 default=uuid.uuid4。所以我认为它会自动创建pk。也感谢您的链接。
    • 不客气!我添加了解释和替代解决方案。
    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    相关资源
    最近更新 更多