Зміст
Для покращення можливості відображення інформації про користувачів в адміністративній панелі сайту реалізована можливість відображення аватарів користувачів, як у спеціальній моделі 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