2009-10-15 9 views
6

は私がmany2many関係に余分なフィールドがそこにいる普通の状況にいると仮定することはできません:私は余分インラインフォームのフィールドでの作業 - save_model、save_formset、差の感覚

class Person(models.Model): 
    name = models.CharField(max_length=128) 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 

# other models which are unrelated to the ones above.. 

class Trip(models.Model): 
    placeVisited = models.ForeignKey(Place) 
    visitor = models.ForeignKey(Person) 
pleasuretrip = models.Boolean() 

class Place(models.Model): 
    name = models.CharField(max_length=128) 

に、インラインで表示されるメンバーシップフォームのいくつかの余分なフィールドを追加します。これらのフィールドは、基本的に別のモデル(トリップ)のインスタンス化へのショートカットです。 Tripには独自の管理ビューがありますが、これらのショートカットが必要なのは、プロジェクトパートナーがシステムの「メンバーシップ」データを入力する際に​​、「旅行」情報も便利なことです(また、Membershipの情報の一部が旅行などにコピーするなど)。

だから私は持っていたいすべてが会員インラインでの2つの追加フィールドである - placeVisitedとpleasuretrip - 一緒にPersonインスタンスと私はバックグラウンドでトリップモデルをインスタンス化できるようになる...

私が見つけました自分のフォームを定義することで、インラインビューに余分なフィールドを簡単に追加することができます。しかし、いったんデータが入力されると、私はそれを行うために必要な保存操作を実行するために、どのようにいつそれらを参照するのですか?

class MyForm(forms.ModelForm): 
place = forms.ModelChoiceField(required=False, queryset=Place.objects.all(), label="place",) 
pleasuretrip = forms.BooleanField(required=False, label="...") 

class MembershipInline(admin.TabularInline): 
model = Membership 
form = MyForm 
    def save_model(self, request, obj, form, change): 
     place = form.place 
     pleasuretrip = form.pleasuretrip 
     person = form.person 
     .... 
     # now I can create Trip instances with those data 
     .... 
     obj.save() 

class GroupAdmin(admin.ModelAdmin): 
model = Group 
.... 
inlines = (MembershipInline,) 

これは動作していないようです...私も多分... save_formset方法で困惑ビットは1、私が使用しなければならないということであるんですか? 多くの助けのために事前にありがとう!

答えて

2

私はちょうどこの同じ問題にぶつかりました。解決策は、save_formsetとsave_model両方のインラインで、呼び出されないようです。代わりに、呼び出されているformsetに親を実装する必要があります。

model = Group 
    .... 
    inlines = (MembershipInline,) 

    def save_formset(self, request, form, formset, change): 
     instances = formset.save(commit=False) 

     for instance in instances: 
      # Here an instance is a MembershipInline formset NOT a group... 
      instance.someunsetfield = something 

      # I think you are creating new objects, so you could do it here. 
      instance.save() 
14

シンは彼の答えで指摘するように、TabularInlineとStackedInlineのために、あなたはインラインが含まれていModelAdminの内部save_formsetメソッドをオーバーライドする必要があります。

GroupAdmin(admin.ModelAdmin): 
    model = Group 
    .... 
    inlines = (MembershipInline,) 

    def save_formset(self, request, form, formset, change): 
     instances = formset.save(commit=False) 

     for instance in instances: 
      if isinstance(instance, Member): #Check if it is the correct type of inline 
       if(not instance.author): 
        instance.author = request.user 
       else: 
        instance.modified_by = request.user    
       instance.save() 
関連する問題