Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

Django - Урок 041. Отображение изображений в админ панели на примере пользовательского профиля

Image, Django, avatar

Для улучшения возможности отображения информации о пользователях в административной панели сайта, реализовал возможность отображения аватаров пользователей, как в специальной модели UserProfile, которая имеет One-To-One отношение к модели User, так и в самой модели User добавил отображение аватарки через inline форму.

Выглядит это следующим образом:

Список пользовательских профилей

Отображение аватарки в пользовательском профиле

Список пользователей

Аватарка в отображении информации о пользователе

Реализация

Модель UserProfile

models.py

# метод для указания места загрузки аватарок
def upload_to(instance, filename):
    return 'avatars/%s' % filename


class UserProfile(LikeDislikeRelationMixin, models.Model):

    # Укажем отношение к модели пользователя
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    avatar = models.ImageField(
        verbose_name=_('Avatar'), upload_to=upload_to, null=True, blank=True
    )

    def __str__(self):
        return self.user.username

    # Здесь я возвращаю аватарку или картинку с совой, если аватар не выбран
    def get_avatar(self):
        if not self.avatar:
            return '/static/images/owl-gray.svg'
        return self.avatar.url

    # метод, для создания фейкового поля таблицы в режиме read only
    def avatar_tag(self):
        return mark_safe('<img src="%s" width="50" height="50" />' % self.get_avatar())

    avatar_tag.short_description = 'Avatar'

admin.py

А теперь посмотрим, как объявить административную форму для нашей модели UserProfile

class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('avatar_tag', 'user') # В качестве поля указываем метод, который вернёт тег картинки в списке пользовательских профилей
    readonly_fields = ['avatar_tag'] # обязательно read only режим
    fields = ('avatar_tag', 'user') # Указываем поля, которые нужно отобразить в административной форме

Модель User

С пользовательской моделью будет немного попроще. Здесь меньше информации.

admin.py

# Нужна inline форма
class ProfileInline(admin.StackedInline):
    model = models.UserProfile # указываем модель профиля
    can_delete = False # запрещаем удаление
    fields = ('avatar_tag',) # Указываем, какое поле отображать, снова тег аватарки
    readonly_fields = ['avatar_tag'] # Указываем, что это read only поле

# Создаём свою форму для отображения пользовательского профиля
class EUserAdmin(UserAdmin):
    # Указываем, что будет в качестве inline формы
    inlines = [
        ProfileInline 
    ]
    # модифицируем список отображаемых полей, чтобы увидеть аватарку с остальными полями
    list_display = ('avatar_tag',) + UserAdmin.list_display

    # а также создаём метод для получения тега аватарки из пользовательского профиля
    def avatar_tag(self, obj):
        return obj.userprofile.avatar_tag()

Регистрируем все модели в административной панели

admin.site.register(UserProfile, UserProfileAdmin)

admin.site.unregister(User)
admin.site.register(User, EUserAdmin)

Для сайтов на Django рекомендую VDS-хостинг TIMEWEB

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
A
22 января 2019 г. 21:22
Allyonz

C++ - Тест 001. Первая программа и типы данных

  • Результат:40баллов,
  • Очки рейтинга-8
A
22 января 2019 г. 14:15
Alex

Qt - Тест 001. Сигналы и слоты

  • Результат:89баллов,
  • Очки рейтинга6
IO
20 января 2019 г. 18:39
Ivan Otreshko

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
Последние комментарии
22 января 2019 г. 13:17
Евгений Легоцкой

Создайте тогда тему здесь на форуме в разделе Qt с выкладками кода и вашими попытками внедрения делегата, позже гляну или может кто-то ещё глянет из опытных пользователей.
I
22 января 2019 г. 13:13
IscanderChe

Не проще тогда использовать сразу кастомный делегат с чекбоксом? Я попробовал, но там засада в том, что чекбокс показывается только при щелчке на ячейку, а дефолтно показывается значение. Как ...
22 января 2019 г. 12:15
Евгений Легоцкой

Если будет не приемлемо потом, то тогда через кастомный Item Delegate нужно будет перерисовать ячейки в той колонке.
I
22 января 2019 г. 12:09
IscanderChe

Получилось приемлемо. Спасибо!Нюанс только в том, что поле рядом с чекбоксом не пропадает, оно просто пустое, что видно при выделении ячейки. Но этого достаточно.
22 января 2019 г. 11:50
Евгений Легоцкой

Переопределить метод data для той колонки и роли Qt::DisplayRole, чтобы в том случае возвращался QVariant() я так думаю... Но возможно, что у вас там будут нюансы, если вы туда чекбокс за...
Сейчас обсуждают на форуме
23 января 2019 г. 7:54
Михаиллл

Зарание спасибо.А еще на эту тему можно будет сделать статью. Это контент будет уникальным.
23 января 2019 г. 7:37
Евгений Легоцкой

Hello. Maybe the English will be better for you? I think russian is not native language for you, or did I mistake? Did I undesrtood rightly, that you mean this documentation ( ...
I
22 января 2019 г. 13:45
IscanderChe

Всем добрый день. Суть задачи: надо, чтобы в одной из колонок QTableView вместо хранимого в QSqlTableModel значения выводился чекбокс и при смене состояния чекбокса значения в базе тоже ...
M
22 января 2019 г. 13:15
Max-P85

Евгений, огромное спасибо, все работает!
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы