Условное выражение, встроенное в администраторе Django?

Я пытаюсь выяснить способ отобразить следующий 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,]

но результатом было то же - никакая ошибка, нет встройте.

7
задан Tony Guinta 14 July 2010 в 12:41
поделиться

1 ответ

Я решил изменить всю парадигму и решить свою проблему другим способом. Вместо того, чтобы иметь единую админку для всех персон с условным инлайном, я решил:

  1. Переопределить queryset для фильтрации только для членов и сохранить RelativeInline с админкой для этой модели
  2. Создать прокси-модель и переопределить ее queryset для фильтрации для нечленов. Админ для этой модели не включает 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)
1
ответ дан 7 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: