2017-04-24 9 views
1

MultipleChoiceFieldを私のフォームに使用します。選択した値をすべてデータベースに追加しますが、使用する次のコードは最後に選択した値だけを追加します。私は私のビューで複数の番号オブジェクトを作成しようとしました。私は間違っていた?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) 

答えて

1

あなたが追加する必要がありますrequirement.pk = Nonesaveのすべての呼び出しは、データベースに新しい行を挿入するように:

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は新しい行を作成する代わりにその行を更新しようとします。

代替ソリューション

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() 
+0

をありがとう:あなたはこのようなループのためにrequirement = form.save(commit=False)を置けば、あなたはこのすべてを避けることができます! 'requirement.pk = None'は私のために働いていますが、なぜそれが動作するのかわかりませんxD少し説明できますか?あなたはコードフィールドが私のpkであることがわかるので、default = uuid.uuid4も使用します。だから私はそれが自動的にpkを作成すると思った。また、リンクに感謝します。 –

+0

よろしくお願いいたします。私は説明と別の解決策を追加しました。 –

関連する問題