Политика конфиденциальностиКонтактыО сайтеОтзывы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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
ГК
20 марта 2019 г. 9:01
Геннадий Костоянский

C++ - Тест 002. Константы

  • Результат:0баллов,
  • Очки рейтинга-10
ГК
20 марта 2019 г. 8:46
Геннадий Костоянский

C++ - Тест 002. Константы

  • Результат:25баллов,
  • Очки рейтинга-10
ГК
20 марта 2019 г. 8:00
Геннадий Костоянский

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

  • Результат:100баллов,
  • Очки рейтинга10
Последние комментарии
MU
20 марта 2019 г. 15:43
Maciej Urmański

It's possible to simply add vote option for non logged users?
20 марта 2019 г. 9:45
Евгений Легоцкой

Добрый день. Поппробуйте домен localhost, а url соответственно http://localhost Возможно, потребуется указать порт. Например, так http://localhost:8000
19 марта 2019 г. 12:57
AlexanderBardin

Добрый день. А проверить работоспособность локально как-то можно не указывая реальнй сайт (еще в разработке)
16 марта 2019 г. 13:55
Дмитрий

Спасибо за статью. Давно итересует следующий вопрос: с помощью переменных QMAKE_TARGET_COMPANYQMAKE_TARGET_PRODUCTQMAKE_TARGET_DESCRIPTIONможно задать свойства компилируемой программы, о...
JS
12 марта 2019 г. 10:19
Jean Stefanovich

Большое спасибо за разъяснения!
Сейчас обсуждают на форуме
20 марта 2019 г. 12:26
Евгений Легоцкой

Лучше стараться избегать этого. Нормального механизма нет. Я просто выдёргиваю из бэкенда перевёденные куски шаблона, если нужно что-то задействовать в JS.
17 марта 2019 г. 22:47
Евгений Легоцкой

Добрый день. Вот, нашлось у меня немного времени. Делается это через шаблон проектирования наблюдатель. GraphKS_mfvSlup.zip
ЧГ
15 марта 2019 г. 21:52
Чарльз Грин

спасибо, попробую, отпишусь
m
15 марта 2019 г. 19:41
mihamuz

Сори догадался)
n
12 марта 2019 г. 16:57
newbie.works.with.QT

Большооооое спасибо!!!!!Не передать как я вам благодарен, спасибо что всегда отзываетесь.Теперь я смогу продолжить работу в QT!!! (пробую писать бота (Я как вы могли догадаться немного не пр...
Присоединяйтесь к нам в социальных сетях

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