質問

まず、別の方法がある場合に備えて、私が達成しようとしていることをレイアウトします!

マルチセレクトインターフェイスのいずれかを使用して、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する必要があるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top