Django - 用户、用户资料与管理员

10 投票
3 回答
17808 浏览
提问于 2025-04-16 09:13

我正在尝试让Django的管理界面显示我的个人资料信息。现在它可以显示所有用户,但没有任何个人资料信息。我不太确定该怎么做才能让它正常工作。

我在网上搜索后找到了一段代码:

from auth.models import UserProfile
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin

admin.site.unregister(User)

class UserProfileInline(admin.StackedInline):
    model = UserProfile

class UserProfileAdmin(UserAdmin):
    inlines = [UserProfileInline]

admin.site.register(User, UserProfileAdmin)

不过,我觉得这段代码没有起作用。当我登录到管理页面时,我看到“用户”、“组”和“站点”。我点击“用户”,可以看到所有用户的列表,但没有任何个人资料的提示。点击某个用户可以看到该用户的信息,但仍然没有个人资料的信息。

如果有帮助的话,这是我的模型声明:

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    company = models.CharField(max_length=30)
    user = models.ForeignKey(User, unique=True)

还有我的注册代码:

def register(request):
    if request.method == 'POST':
        uf = UserForm(request.POST)
        upf = UserProfileForm(request.POST)
        if uf.is_valid() and upf.is_valid():
            user = uf.save()
            userprofile = upf.save(commit=False)#need to get the user profile object first
            userprofile.user = user #then set the user to user
            userprofile.save() #then save to the database
            return HttpResponseRedirect('/auth/login/')
    else:
        uf = UserForm()
        upf = UserProfileForm()
    return render_to_response('register.html', dict(userform=uf,userprofileform=upf),context_instance=RequestContext(request))

3 个回答

3

缺少的逗号应该没什么大问题。我猜可能是你新加了一个 admin.py 文件,但开发服务器没有识别到这个文件。如果你重启一下开发服务器,它就能看到这个新文件了。

6

这并不是对你问题的直接回答,但根据Django Admin的文档,你可以在用户的“表格”中显示来自用户资料的信息。而且你还可以让这些信息可以被搜索。

这看起来可能是这样的(修改自C. Alan Zoppa的回答):

class UserProfileAdmin(UserAdmin):
    inlines = [ UserProfileInline, ]
    def company(self, obj):
        try:
            return obj.get_profile().company
        except UserProfile.DoesNotExist:
            return ''
    list_display = UserAdmin.list_display + ('company',)
    search_fields = UserAdmin.search_fields + ('userprofile__company',)

不过,如果你的资料类不再叫UserProfile,那么在搜索时可能会遇到一些问题。

26

我不太清楚具体哪里出问题了,不过我可以给你一个简单一点的例子,这个例子我知道是可以正常工作的。把下面的代码放到你能正常运行的admin.py文件里。试着在你的内联代码后面加一个逗号,有些东西在没有这个逗号的时候会出错。

from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from accounts.models import UserProfile

admin.site.unregister(User)

class UserProfileInline(admin.StackedInline):
    model = UserProfile

class UserProfileAdmin(UserAdmin):
    inlines = [ UserProfileInline, ]

admin.site.register(User, UserProfileAdmin)

撰写回答