Для улучшения возможности отображения информации о пользователях в административной панели сайта реализована возможность отображения аватаров пользователей, как в специальной модели UserProfile, имеющей отношение One-To-One к модели User, так и в самой модели User , он добавил отображение аватара через встроенную форму.
Это выглядит так:
Список профилей пользователей
Отображение аватаров в профиле пользователя
список пользователей
Аватар в отображении информации о пользователе
Реализация
UserProfile model
models.py
# method for indicating where to load avatars def upload_to(instance, filename): return 'avatars/%s' % filename class UserProfile(LikeDislikeRelationMixin, models.Model): # We indicate the relationship to the user 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 # Here I return the avatar or picture with an owl, if the avatar is not selected def get_avatar(self): if not self.avatar: return '/static/images/owl-gray.svg' return self.avatar.url # method to create a fake table field in read only mode 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') # As a field, specify the method that will return the picture tag in the list of user profiles. readonly_fields = ['avatar_tag'] # Be sure to read only mode fields = ('avatar_tag', 'user') # Specify the fields that need to be displayed in the administrative form
Модель User
С пользовательской моделью будет немного проще. Здесь меньше информации.
admin.py
# Need inline form class ProfileInline(admin.StackedInline): model = models.UserProfile # specify the profile model can_delete = False # prohibit removal fields = ('avatar_tag',) # Specify which field to display, again avatar tag readonly_fields = ['avatar_tag'] # Specify that this read only field # Create your own form to display a user profile class EUserAdmin(UserAdmin): # Specify what will be in the form of inline inlines = [ ProfileInline ] # modify the list of displayed fields to see the avatar with the other fields list_display = ('avatar_tag',) + UserAdmin.list_display # and also create a method for getting the avatar tag from the user profile def avatar_tag(self, obj): return obj.userprofile.avatar_tag()
Зарегистрируйте все модели в административной панели
admin.site.register(UserProfile, UserProfileAdmin) admin.site.unregister(User) admin.site.register(User, EUserAdmin)
For sites on Django recommend VDS-hosting TIMEWEB