Django - создание подклассов UserAdmin для создания динамических шаблонов? - PullRequest
1 голос
/ 03 января 2011

Я не совсем уверен, как сформулировать вопрос, который я хочу задать.Допустим, у вас есть два объекта профиля, которые могут быть связаны с пользователем.Только один из них будет ассоциирован (есть сопоставление один к одному), но это может быть один из двух возможных объектов профиля.Мой код администратора выглядит следующим образом:

admin.site.unregister(User)

class AProfileInline(admin.StackedInline):
    model = UserProfileA

class BProfileInline(admin.StackedInline):
    model = UserProfileB

class UserProfileAdmin(UserAdmin):
    inlines = [AProfileInline, BProfileInline, ]

admin.site.register(User, UserProfileAdmin)

Это работает нормально, но, конечно, отображает ненужную информацию.Было бы неплохо, если бы страница администратора отображала только правильные строки.Я полагаю, что это сложно и, вероятно, является проблемой, если, например, я хочу перейти с одного типа профиля на другой.Есть мысли?

1 Ответ

0 голосов
/ 03 января 2011

Это один из способов сделать это. Имейте в виду, это взломать . Я основал этот код на коде ModelAdmin в django.contrib.admin.options.

admin.site.unregister(User)

class AProfileInline(admin.StackedInline):
    model = UserProfileA

class BProfileInline(admin.StackedInline):
    model = UserProfileB

class UserProfileAdmin(UserAdmin):
    inlines = [AProfileInline, BProfileInline, ]

    def get_object(self, *args, **kwargs):
        obj = super(UserProfileAdmin, self).get_object(*args, **kwargs)
        if obj:
            self.inline_instances = []
            if AProfileInline.model.objects.filter(user=obj):
                inline_instance = AProfileInline(self.model, self.admin_site)
                self.inline_instances.append(inline_instance) 
            if BProfileInline.model.objects.filter(user=obj):
                inline_instance = BProfileInline(self.model, self.admin_site)
                self.inline_instances.append(inline_instance)
        return obj

admin.site.register(User, UserProfileAdmin)

Это решение предполагает, что и UserProfileA, и UserProfileB имеют отношения внешнего ключа к User через поле с именем user.

Функции change_view и delete_view вызывают get_object, поэтому этот код должен должным образом заменить экземпляры встроенной формы перед визуализацией этих представлений.

Этот код переопределяет get_object для выполнения следующих дополнительных действий:

  1. Встроенные формы по умолчанию пусты (для уже существующих объектов)
  2. Если обнаружен UserProfileA, который ссылается на текущий User (через поле user), добавляется встроенная форма для UserProfileA.
  3. Если обнаружен UserProfileB, который ссылается на текущий User (через поле user), добавляется встроенная форма для UserProfileB.

Причуды этого решения:

  • UserProfileAdmin.__init__ по-прежнему создает версию по умолчанию self.inline_instances, которая затем будет перезаписываться при использовании change_view или delete_view.
  • Эта функция никогда не предназначалась для того, чтобы использовать ее для кода, приведенного выше. Если UserProfileAdmin.get_object вызывается в любом другом коде, встроенные формы будут пересчитаны без необходимости.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...