В админке Django возможно ли разделить модели на подмодели по группам? - PullRequest
2 голосов
/ 07 сентября 2010

Я думаю, что это проще всего понять в качестве примера:

У меня есть модели Image и ImageType, где и изображение имеет только один тип. Параметры в ImageType будут регулировать размер изображения, размер эскиза и т. Д., Так как изображения в фотогалерее могут отображаться иначе, чем, скажем, изображения профиля.

Я хочу, чтобы изображения профиля и изображения галереи отображались в виде отдельных моделей на сайте администратора Django. Один из вариантов - сделать что-то вроде этого:

class ProfileImage (Image):
    pass

class GalleryImage (Image):
    pass

class ProfileImageAdmin (ImageAdmin):
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(type='profile')

class GalleryImageAdmin (ImageAdmin):
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(type='gallery')

admin.site.register(ProfileImage, ProfileImageAdmin)
admin.site.register(GalleryImage, GalleryImageAdmin)

Но помимо наличия избыточного кода, это полностью сводит на нет цель иметь базу данных для их организации в первую очередь. Другой вариант - потерять мои модели Image и ImageType и создать отдельные почти идентичные таблицы для каждого типа (т. Е. ProfileImage и GalleryImage), но это еще хуже, поскольку это потребует от пользователей доступа конфигурационные файлы, которые, по моему мнению, почти побеждают цель CMS.

Есть ли способ, которым я могу сделать что-то подобное?

admin.site.register(Image, ImageAdmin, group_by='type')

В качестве альтернативы, если это невозможно, есть ли у кого-нибудь предложения о других способах решения этой проблемы? (Например, есть ли в python способ динамически создавать классы на основе базы данных?)

Ура! Matt

1 Ответ

4 голосов
/ 08 сентября 2010

Есть способ.Это предполагает использование модели proxy для одного (или обоих) типов изображений.Затем вы можете добавить отдельных администраторов для двух.Например,

# models.py
class ProfileImage (Image):
    class Meta:
        proxy = True

class GalleryImage (Image):
    class Meta:
        proxy = True

Это позволит избежать создания новых таблиц.Вы по-прежнему будете хранить все данные в таблице, соответствующей модели Image.Затем вы можете зарегистрировать двух разных администраторов для этих прокси.

# admin.py
class ProfileImageAdmin (ImageAdmin):
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(type='profile')

class GalleryImageAdmin (ImageAdmin):
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(type='gallery')

admin.site.register(ProfileImage, ProfileImageAdmin)
admin.site.register(GalleryImage, GalleryImageAdmin)
...