• Members 5 сообщений
    5 июня 2021 г. 21:50

    Всем доброго времени суток. В общем, сделал кастомную модель User`а, всё работает отлично, но новые поля не отображаются в админке Джанго. То есть, поля как бы есть, есть аватарка и я могу её вывести в шаблоне и т.д, но в админке её нету. Может проблема в том, что моя кастомная модель называется так же, как и в Джанго?

    admin.py

    from django.contrib import admin
    from django.contrib.auth.admin import UserAdmin
    from .forms import UserCreationForm, UserChangeForm
    from .models import User
    
    
    class UserAdmin(UserAdmin):
        add_form = UserCreationForm
        form = UserChangeForm
        model = User
        ordering = ['-id',]
        list_display = ['avatar_tag', 'username', 'email', 'first_name', 'last_name', 'uuid']
        list_display_links = list_display
        search_fields = ['id', 'username', 'first_name', 'last_name', 'uuid', 'email']
        readonly_fields = ['avatar_tag']
    
    admin.site.register(User, UserAdmin)
    

    models.py

    class User(AbstractUser):
        uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
        avatar = models.ImageField(default='images/users/camera_100.png', upload_to='users/uploads/images/')
    
        class Meta:
            verbose_name = _('User')
            verbose_name_plural = _('Users')
    
  • Team
    5 июня 2021 г. 22:17

    Почему в модели avatar, а в админке avatar_tag?

  • Members 5 сообщений
    5 июня 2021 г. 22:41

    Там еще есть методы. Например, с помощью avatar_tag я показываю автарки в списке пользователей в админке

    class User(AbstractUser):
        uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
        avatar = models.ImageField(default='images/users/camera_100.png', upload_to='users/uploads/images/')
    
        class Meta:
            verbose_name = _('User')
            verbose_name_plural = _('Users')
    
        def avatar_tag(self):
            return mark_safe('<img src="%s" width="50" height="50" style="border-radius: 9999px" />' % self.avatar.url)
    
        avatar_tag.short_description = 'Avatar'
    
        def __str__(self):
            if self.first_name and self.last_name:
                name = str('{} {}').format(self.first_name, self.last_name)
            else:
                name = str('{}').format(self.username)
            return name
    
        def get_absolute_url(self):
            return reverse_lazy('users:profile', args={self.uuid})
    
  • Members 5 сообщений
    5 июня 2021 г. 23:18

    Походу я лох и где-то облажался, все еще не понял в чем именно, но если не регистрировать в админке UserAdmin, то всё нормально или вместо того, чтобы наследоваться от UserAdmin, использовать обычную admin.ModelAdmin

  • Members 2 сообщения
    6 июня 2021 г. 10:35

    так и надо было наследоваться от modeladmin)

  • Team
    6 июня 2021 г. 10:42

    UserAdmin уже наследуется от admin.ModelAdmin. В недрах джанги есть вот такое:

    @admin.register(User)
    class UserAdmin(admin.ModelAdmin):
        add_form_template = 'admin/auth/user/add_form.html'
        change_user_password_template = None
        fieldsets = (
            (None, {'fields': ('username', 'password')}),
            (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
            (_('Permissions'), {
                'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
            }),
            (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
        )
    
    

    Подозреваю, что надо снять с регистрации стандартную модель User'а, так как тут уже в админке она зарегистрирована, а следующей строкой снова зарегистрировать уже свою. Но это не точно, надо экспериментировать.

  • Team
    6 июня 2021 г. 10:46

    С самого начала не совсем понятно было, почему UserAdmin был использован. Обычно наследуются от admin.ModelAdmin.