管理ページでM2Mの両側を編集します
-
19-09-2019 - |
質問
まず、別の方法がある場合に備えて、私が達成しようとしていることをレイアウトします!
マルチセレクトインターフェイスのいずれかを使用して、M2M関係の両面をM2M関係の両側(できれば、通常のページにある場合でも必要な場合は、できれば、管理ページでできますが)を編集できるようにしたいと考えています。
問題は明らかに裏側にあります。主な側面(関係が定義されている)は自動的にうまく機能するためです。
私はここでいくつかのアドバイスを試みました。
Djangoメーリングリストで私が得たアドバイスは、カスタムモデルフルームを使用することでした。マルチセレクトボックスを表示する限りはありますが、選択されたものから始まり、変更された変更を保存しないため、「接続」されていないようです。
これがコードの適切なスニペットです:
#models.py
class Tag(models.Model):
name = models.CharField(max_length=200)
class Project(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
tags = models.ManyToManyField(Tag, related_name='projects')
#admin.py
class TagForm(ModelForm):
fields = ('name', 'projects')
projects = ModelMultipleChoiceField(Project.objects.all(), widget=SelectMultiple())
class Meta:
model = Tag
class TagAdmin(admin.ModelAdmin):
fields = ('name', 'projects')
form = TagForm
上記のコードを機能させるか、それを行うためのより良い方法を提供することで、どんな助けも大歓迎です!
Davidm
解決
自動的に何も起こらない理由は、「プロジェクト」フィールドがタグモデルの一部ではないためです。つまり、すべての仕事を自分で行わなければなりません。 (タグフォームで)のようなもの:
def __init__(self, *args, **kwargs):
super(TagForm, self).__init__(*args, **kwargs)
if 'instance' in kwargs:
self.fields['projects'].initial = self.instance.project_set.all()
def save(self, *args, **kwargs):
super(TagForm, self).save(*args, **kwargs)
self.instance.project_set.clear()
for project in self.cleaned_data['projects']:
self.instance.project_set.add(project)
コードはテストされていないため、動作させるためにいくつかをTweekする必要があるかもしれません。
所属していません StackOverflow