如何在Django用户列表视图中显示UserProfile的头像图片?
解决方案
问题出在你把list_display配置到了Inline类中,但Inline仅作用于用户的编辑页面,不会影响用户列表视图的展示。要在用户列表显示头像,需要在继承UserAdmin的UserProfileAdmin中配置列表展示字段,并通过反向关联获取UserProfile的头像信息。
步骤1:修复模型中的头像判断逻辑
原avatar_tag方法直接判断self.avatar.url可能引发错误(当avatar为null时访问url会抛出异常),先修改models.py的判断逻辑:
# models.py from django.utils.safestring import mark_safe from django.contrib.auth.models import User class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') # 添加related_name方便反向调用 def get_upload_avatar_to(self, filename): return f"images/avatar/{self.user.id}/{filename}" avatar = models.ImageField(upload_to=get_upload_avatar_to, null=True, blank=True) def avatar_tag(self): if self.avatar: # 先判断avatar是否存在,再访问url return mark_safe(f'<img src="{self.avatar.url}" height="50"/>') return "" avatar_tag.short_description = '头像' avatar_tag.allow_tags = True bio = models.TextField(default="", blank=True) display = models.CharField(default='', max_length=512, blank=True)
步骤2:在Admin类中配置列表显示字段
修改admin.py,在UserProfileAdmin中添加自定义方法获取头像,并更新list_display:
# admin.py from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.utils.safestring import mark_safe from .models import UserProfile, User class UserProfileInline(admin.StackedInline): model = UserProfile fk_name = 'user' can_delete = False verbose_name = "用户资料" verbose_name_plural = '用户资料' classes = ('text-capitalize','collapse open') extra = 1 fieldsets = ( ("资料", {'fields': ('avatar','bio', 'display',)}),) def user_avatar_tag(obj): # 通过反向关联获取用户的Profile,判断是否存在头像 if hasattr(obj, 'profile') and obj.profile.avatar: return mark_safe(f'<img src="{obj.profile.avatar.url}" height="50"/>') return "" user_avatar_tag.short_description = '头像' class UserProfileAdmin(UserAdmin): inlines = (UserProfileInline,) # 将自定义的头像方法添加到list_display中,和原有字段一起展示 list_display = ('username', 'email', 'first_name', 'last_name', user_avatar_tag) # 注册自定义的UserAdmin,替换默认的User admin admin.site.unregister(User) admin.site.register(User, UserProfileAdmin)
关键说明
- 反向关联:给
OneToOneField添加related_name='profile',可以更直观地通过user.profile访问用户的资料模型。 - 列表页字段配置:必须在
UserProfileAdmin(继承UserAdmin)中设置list_display,才能控制用户列表的展示内容。 - 异常避免:判断头像是否存在时,先检查
avatar字段本身是否非空,再访问url属性,避免抛出DoesNotExist或AttributeError。
内容的提问来源于stack exchange,提问作者B L Praveen
相关产品推荐
相关产品推荐

