Tale questione potrebbe essere simile a this one, ma la sua non ...Override risparmiare sulle Django InlineModelAdmin
Ho una struttura di modello come:
class Customer(models.Model):
....
class CustomerCompany(models.Model):
customer = models.ForeignKey(Customer)
type = models.SmallIntegerField(....)
Sto usando InlineModels
, e hanno due tipi di CustomerCampany.type
. Così mi definisco due in linea differente per la CustomerCompany
e OV sovrascrivo InlineModelAdmin.queryset
class CustomerAdmin(admin.ModelAdmin):
inlines=[CustomerCompanyType1Inline, CustomerCompanyType2Inline]
class CustomerCompanyType1Inline(admin.TabularInline):
model = CustomerCompany
def queryset(self, request):
return super(CustomerCompanyType1Inline, self).queryset(request).filter(type=1)
class CustomerCompanyType2Inline(admin.TabularInline):
model = CustomerCompany
def queryset(self, request):
return super(CustomerCompanyType2Inline, self).queryset(request).filter(type=2)
Tutto è bello e buono fino a qui, ma per l'aggiunta di nuovi record per InlineModelAdmin
, ho ancora bisogno di visualizzare type
campo CustomerCompany
sul AdminForm
, poiché non posso ignorare save
metodo di un InlineModelAdmin
piacere:
class CustomerCompanyType2Inline(admin.TabularInline):
model = CustomerCompany
def queryset(self, request):
return super(CustomerCompanyType2Inline, self).queryset(request).filter(type=2)
#Following override do not work
def save_model(self, request, obj, form, change):
obj.type=2
obj.save()
Utilizzando un segnale non è anche una soluzione dal mio segnale sender
sarà lo stesso Model
, quindi non in grado di rilevare che InlineModelAdmin
inviarlo e quale deve essere il type
...
C'è un modo che mi permetta di impostare type
campo prima di salvare?
+1 buon approccio usare i modelli proxy.Ho aggiornato la mia risposta per correggere gli errori più ovvi che hai menzionato. Ciò lascia ancora il problema di capire quale inline rappresenta il formset. – Alasdair
In realtà, l'approccio del modello proxy elimina la necessità di sovrascrivere 'save_formset'. I proxy stessi hanno sovrascritto i metodi 'save' che sanno come salvare il tipo giusto. Quindi, usi semplicemente la linea inline senza preoccuparti di ciò. –
Il mio commento non era chiaro - ero d'accordo sul fatto che anche dopo aver risolto i problemi in 'save_formset' (' save_m2m' etc), c'era ancora il problema di quale linea si sta salvando. Ho capito che l'approccio al modello proxy evita quello :) – Alasdair