Я пытаюсь выяснить способ отобразить следующий RelativeInline, только если Человек is_member Верен.
Текущий admin.py:
class RelativeInline(admin.TabularInline):
model = Relative
fk_name = 'member'
class PersonAdmin(admin.ModelAdmin):
inlines = [RelativeInline,]
ordering = ('first_name',)
list_filter = ('is_member',)
search_fields = ('first_name', 'last_name',)
date_hierarchy = 'member_date'
list_display = ('first_name', 'last_name', 'is_member', 'member_date', 'photo')
admin.site.register(Person, PersonAdmin)
Единственная подсказка, которую я смог найти, состоит в том, что я смог переопределять get_formset, но я не мог найти хороший пример, таким образом, моя слабая попытка не работала.
Вот моя неудачная попытка:
class RelativeInline(admin.TabularInline):
model = Relative
fk_name = 'member'
class PersonAdmin(admin.ModelAdmin):
ordering = ('first_name',)
list_filter = ('is_member',)
search_fields = ('first_name', 'last_name',)
date_hierarchy = 'member_date'
list_display = ('first_name', 'last_name', 'is_member', 'member_date', 'photo')
def get_formset(self, request, obj=None, **kwargs):
if obj.is_member:
inlines = [RelativeInline,]
return super(PersonAdmin, self).get_formset(request, obj, **kwargs)
admin.site.register(Person, PersonAdmin)
Нет никаких ошибок, сгенерированных этим кодом, но не не встраивают, появляется независимо от того, является ли Человек is_member TRUE или FALSE.
Обновление: друг предложил, чтобы я попытался измениться:
inlines = [RelativeInline,]
кому:
self.inlines = [RelativeInline,]
но напрасно. Я также попробовал:
PersonAdmin.inlines = [RelativeInline,]
но результатом было то же - никакая ошибка, нет встройте.
Я решил изменить всю парадигму и решить свою проблему другим способом. Вместо того, чтобы иметь единую админку для всех персон с условным инлайном, я решил:
В конечном итоге, я думаю, что это более чистый подход. Теперь членов можно поддерживать, а родственников (нечленов) можно добавлять в инлайн. NonMemberAdmin позволяет редактировать нечленов.
models.py:
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
is_member = models.BooleanField()
is_active = models.BooleanField(default=True)
class Meta:
verbose_name_plural = 'Members'
ordering = ('first_name', 'last_name')
class PersonProxy(Person):
class Meta:
proxy = True
verbose_name_plural = 'Non-Members'
class Relationship(models.Model):
name = models.CharField(max_length=50)
class Relative(models.Model):
member = models.ForeignKey(Person, related_name='relative_member')
relative = models.ForeignKey(Person, related_name='relative_relative')
relationship = models.ForeignKey(Relationship)
admin.py:
class RelativeInline(admin.TabularInline):
model = Relative
fk_name = 'member'
class MemberAdmin(admin.ModelAdmin):
inlines = [RelativeInline,]
ordering = ('first_name',)
# list_filter = ('is_member',)
search_fields = ('first_name', 'last_name',)
# date_hierarchy = 'member_date'
list_display = ('first_name', 'last_name', 'member_date')
def queryset(self, request):
return (super(MemberAdmin, self).queryset(request)
.filter(is_member=True, is_active=True))
class NonMemberAdmin(admin.ModelAdmin):
ordering = ('first_name',)
search_fields = ('first_name', 'last_name',)
list_display = ('first_name', 'last_name')
def queryset(self, request):
return (super(NonMemberAdmin, self).queryset(request)
.filter(is_member=False, is_active=True))
admin.site.register(Person, MemberAdmin)
admin.site.register(PersonProxy, NonMemberAdmin)