2009-10-15 5 views
6

Supponiamo che io sono nel solito situazione in cui ci sei campi aggiuntivi nel rapporto many2many:Lavorare con campi aggiuntivi in ​​una forma in linea - save_model, save_formset, non si può dare un senso della differenza

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) 

I desidera aggiungere alcuni campi aggiuntivi nel modulo Membership che viene visualizzato tramite Inline. Questi campi sono fondamentalmente una scorciatoia per l'istanziazione di un altro modello (Trip). Trip può avere le sue viste amministratore, ma queste scorciatoie sono necessarie perché quando i miei partner di progetto inseriscono i dati di 'Membership' nel sistema, hanno anche le informazioni 'Trip' a portata di mano (e anche perché alcune delle informazioni in Membership possono solo essere copiati su Trip ecc. ecc.).

Quindi tutto quello che voglio avere è di due campi aggiuntivi nella composizione Inline - placeVisited e pleasuretrip - che insieme con l'istanza persona mi permette di istanziare il modello di viaggio in background ...

ho trovato fuori posso facilmente aggiungere campi extra alla vista in linea definendo il mio modulo. Ma una volta inseriti i dati, come e quando fare riferimento ad essi per eseguire le operazioni di salvataggio che devo fare?

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,) 

Questo non sembra funzionare ... Sono anche un po 'perplesso dal save_formset metodo ... forse è che quello che dovrei usare? Molti grazie in anticipo per l'aiuto !!!!

risposta

2

Ho appena colpito lo stesso problema, e sembra che la soluzione sia che per entrambi save_formset e save_model con inline, non vengono chiamati. Invece devi implementarlo nel formset che viene chiamato che è il genitore, ad es.

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

Come sottolinea syn nella sua risposta, per TabularInline e StackedInline, è necessario eseguire l'override del metodo save_formset all'interno del ModelAdmin che contiene i inline.

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()