7

最初に、別の方法がある場合に備えて、達成しようとしていることを説明します。

マルチセレクトインターフェイスのいずれかを使用して、M2M関係の両側を編集できるようにしたい(必要に応じて通常のページでも可能ですが、管理ページで編集できるようにすることをお勧めします)。

メインサイド(関係が定義されている)は自動的にうまく機能するため、問題は明らかに裏側にあります。

インラインを表示するためにここでいくつかのアドバイスを試しましたが、それは機能しますが、あまり良いインターフェースではありません。

djangoメーリングリストで得たアドバイスは、カスタムModelFormを使用することでした。複数選択ボックスを表示することはできますが、何も選択された状態で開始されず、加えられた変更が保存されないため、何にも「接続」されていないようです。

適切なコードスニペットは次のとおりです。

#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

4

1 に答える 1

2

自動的に何も起こらない理由は、「プロジェクト」フィールドがタグ モデルの一部ではないためです。つまり、すべての作業を自分で行う必要があります。(TagForm で) のようなもの:

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)

コードはテストされていないため、動作させるには微調整が必​​要になる場合があることに注意してください。

于 2009-11-09T11:19:08.213 に答える