You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

关键说明

  1. 反向关联:给OneToOneField添加related_name='profile',可以更直观地通过user.profile访问用户的资料模型。
  2. 列表页字段配置:必须在UserProfileAdmin(继承UserAdmin)中设置list_display,才能控制用户列表的展示内容。
  3. 异常避免:判断头像是否存在时,先检查avatar字段本身是否非空,再访问url属性,避免抛出DoesNotExist或AttributeError。

内容的提问来源于stack exchange,提问作者B L Praveen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:27:36