Для покращення можливості відображення інформації про користувачів в адміністративній панелі сайту реалізована можливість відображення аватарів користувачів, як у спеціальній моделі UserProfile, що має відношення One-To-One до моделі User, так і в самій моделі User, він додав відображення аватара через вбудовану форму.
Це виглядає так:
Список профілів користувачів
Відображення аватарів у профілі користувача
список користувачів
Аватар у відображенні інформації про користувача
Реалізація
Модель профілю користувача
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)
Для сайтів на Django рекомендуємо VDS-хостинг TIMEWEB