To pytanie może wyglądać podobnie do this one, ale jej nie ...Zastąp zapisać na Django InlineModelAdmin
Mam strukturę modelu jak:
class Customer(models.Model):
....
class CustomerCompany(models.Model):
customer = models.ForeignKey(Customer)
type = models.SmallIntegerField(....)
Używam InlineModels
i mają dwa rodzaje CustomerCampany.type
. Więc zdefiniować dwa wypróbujemy inny inline dla CustomerCompany
i OV przesłonić 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)
Wszystko jest ładne i dobrze się tutaj, ale dla dodawania nowych rekordów do InlineModelAdmin
, nadal trzeba wyświetlić type
pole CustomerCompany
na AdminForm
, ponieważ nie mogę zastąpić save
sposób na InlineModelAdmin
lubię:
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()
Korzystanie sygnał nie jest również rozwiązanie, ponieważ mój sygnał sender
będzie taka sama Model
, więc nie mogę wykryć który InlineModelAdmin
wysłać go i co type
musi być ...
Czy istnieje sposób, który pozwoli mi ustawić type
pole przed uratować?
+1 dobre podejście używać modeli proxy.Zaktualizowałem swoją odpowiedź, aby naprawić najbardziej oczywiste błędy, o których wspomniałeś. To nadal pozostawia problem z określeniem, który z nich reprezentuje formularz. – Alasdair
W rzeczywistości podejście modelu proxy eliminuje konieczność nadpisywania 'save_formset'. Same proxy zastąpiły metody "save", które wiedzą, jak zapisać jako właściwy typ. Więc po prostu skorzystaj z linii bez martwienia się o to. –
Mój komentarz nie był jednoznaczny - zgodziłem się, że nawet po naprawieniu problemów w 'save_formset' (' save_m2m' itp.), Wciąż istniał problem, który zapisujesz w linii. Zrozumiałem, że podejście modelu proxy unika tego :) – Alasdair