2009-11-09 7 views
7

最初に、別の方法がある場合に備えて達成しようとしていることを説明します。M2Mの両面を管理者ページで編集する

マルチ選択インターフェイスのいずれかを使用して、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

+1

うわー、ここにフレンドリーな人々、11分2投票! – DavidM

答えて

2

何も自動的に行われていない理由は、「プロジェクト」フィールドは、Tagモデルの一部ではないということです。つまり、自分ですべての作業を行う必要があります。 (TagFormで)ような何か:あなたはそれが仕事を得るためにそれをいくつかのtweekする必要があるかもしれませんので、コードがテストされていないことを

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) 

注意。

+0

トリッキーな感謝のようですが、問題が発生しています。 'インスタンス'はkwargsに存在しますが、初期設定は効果がないようです。テストするために、私はself.fields ['name']を設定しようとしました。initial = 'test'そして、それはインターフェイスにも表示されません。 – DavidM

+0

私はこれを答えとしてマークし、そのことについて念頭に置いておきます。私がそれをソートしたら、ここに答えを投稿します。ありがとう! – DavidM

関連する問題