カスタム(非管理者)Djangoビューでオブジェクトを編集するときに多対多フィールドの値が選択されない

django django-forms django-models many-to-many
カスタム(非管理者)Djangoビューでオブジェクトを編集するときに多対多フィールドの値が選択されない

多対多フィールドを含むdjangoモデルがあります。 同じフォームを使用してオブジェクトを追加/編集します。 既存のオブジェクトを編集用にロードすると、すべてのフィールドに値が関連付けられます*多対多フィールドを除きます(オプションのどれもMultipleSelectBoxウィジェットは選択されていません)*

フォームが編集のためにオブジェクトをロードするときにフィールドの現在の値がMultipleSelectBoxウィジェットで選択されて表示されるように、値を多対多フィールドにバインドする特別な方法はありますか。

SOでユーザーから寄せられた同様の質問を読んでみましたが、クエリに対する答えが見つかりませんでした:(

  1  1


ベストアンサー

同じ問題があり、それは `commit = False`が原因でした。 それを修正する方法は `save_m2m()`を使うことです

# Create a form instance with POST data.
f = AuthorForm(request.POST)
# Create, but don't save the new author instance.
new_author = f.save(commit=False)
# Modify the author in some way.
new_author.some_field = 'some_value'
# Save the new instance.
new_author.save()
# Now, save the many-to-many data for the form.
f.save_m2m()

1


これを試してみてください! これはどうやってできるかを示す私の例です:D

class FirstModel(models.Model):
    title = models.CharField(max_length = 100, unique = True)

class SecondModel(models.Model):
    name = models.CharField(max_length = 100, unique = True)
    first_model = models.ManyToManyField(FirstModel)

class MyForm(forms.Form):
    name = forms.CharField(max_length = 100, required = True)
    first_model = forms.ChoiceField(widget = forms.MultipleSelect)

add関数で保存した後、edit関数で編集するには、次の操作を行います。

def edit(request):
    my_model = MyModel.objects.filter(name = 'You Unique Name').get()
    first_model = my_model.first_model.all()
    my_form = MyForm(initial = {'first_model': first_model})

それだけです:D

0


タイトルとURLをコピーしました