Django настроить представление AdminModel - PullRequest
2 голосов
/ 19 июля 2011

В моем приложении Django у меня есть Guest учетные записи пользователей, которые созданы для всех незарегистрированных пользователей (у них всех есть email='guest@mysite.com '). В то же время я создаю несколько демонстрационных объектов , связанных с учетной записью гостя. Эти объекты находятся в той же таблице (имеют ту же модель), что и объекты для зарегистрированных пользователей. И у меня есть более одного типа (модели) этих объектов, таких как:

class Object1(models.Model):
    user = ForeignKey(...)
    ...

class Object2(models.Model):
    user = ForeignKey(...)
    ...

И что я хотел бы добиться, это отфильтровать все объекты, связанные с гостевыми учетными записями, когда я их просматриваю в django admin .

Прямо сейчас я создаю подкласс django.contrib.admin.views.main.ChangeList и переопределяю метод get_query_set, чтобы выполнить необходимое исключение, и переопределяю get_changelist метод класса ModelAdmin в django во время выполнения:

class FilteredChangeList(ChangeList):
    def get_query_set(self):
        qs = super(FilteredChangeList, self).get_query_set()
        if is_related_to(self.model, Profile):
            qs = qs.exclude(user__email='guest@mysite.com')
        return qs

def my_getchangelist(self, request, **kwargs):
    return FilteredChangeList

ModelAdmin.get_changelist = my_getchangelist

Я полагаю, что переопределение методов django во время выполнения является плохой практикой, поэтому есть ли правильное решение проблемы?

Ответы [ 3 ]

4 голосов
/ 19 июля 2011

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

class MyFilteredAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(MyFilteredAdmin, self).queryset(request)
        if is_related_to(self.model, Profile):
            qs = qs.exclude(user__email='guest@mysite.com')
        return qs

Затем вы можете зарегистрировать свои модели непосредственно с этим новым администратором.class - admin.site.register(Model, MyFilteredAdmin) - или создайте подклассы, которые наследуются от MyFilteredAdmin вместо django's ModelAdmin.

2 голосов
/ 20 июля 2011

Вы также можете иметь прокси-модели.У вас может быть тот, у которого есть «настоящие» пользователи, и у кого есть «гостевые» пользователи.

1 голос
/ 19 июля 2011

Вы можете создать подкласс ModelAdmin и переопределить метод get_changelist вместо переопределения во время выполнения.

class FilteredModelAdmin(ModelAdmin):
    def get_changelist(self, request, **kwargs):
        return FilteredChangeList

Затем зарегистрируйте свои модели в FilteredModelAdmin вместо ModelAdmin.

admin.site.register(Object1, FilteredModelAdmin)
admin.site.register(Object2, FilteredModelAdmin)

Если вам нужно настроить любые другие параметры для своих подклассов моделей FilteredModelAdmin вместо ModelAdmin.

class Object1ModelAdmin(FilteredModelAdmin)
    # other customizations here

admin.site.register(Object1, Object1ModelAdmin)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...