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

10

我正在尝试让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))

你把管理员代码放在一个新应用程序的包中的 admin.py 文件里,并将其添加到了 INSTALLED_APPS 中吗? - Bernhard Vallant
管理员的代码在我的“auth”应用程序中的admin.py文件中。auth已经被添加到了INSTALLED_APPS中。我还正确设置了我的Auth Profile模块。 - JPC
2
“auth” 似乎不是一个好的名称,因为可能会发生冲突。 - Paulo Scardine
也许我会进行更改,但目前为止,所有身份验证的功能都可以使用,只是管理员配置文件无法访问。 - JPC
3个回答

26

我看不出问题在哪里,但这里有一个稍微简单的例子,我知道它是有效的。将其放在任何有效的admin.py中。尝试在inline后添加逗号 - 没有逗号可能会导致某些问题。

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)

1
@JPC 这应该不重要,我知道。你确定你的 admin.py 被识别到了吗? - C. Alan Zoppa
我觉得它起作用了。当我点击一个用户时,现在我可以看到个人资料!哇,谢谢。一个逗号。 - JPC
有没有想法如何将UserProfile信息添加到Users表中,以便可以按其进行排序/搜索? - JPC
1
像在管理应用程序中排序?这可能是可能的,但您可能需要做一些不建议的事情,例如子类化用户模型。您最好尝试在模板中进行猴子补丁。 - C. Alan Zoppa
非常好的回答。谢谢!!!我只是想提醒您包括从django.contrib.auth.models导入用户。 - Roldan Vargas
@C.AlanZoppa,你能给我提供一些建议吗?我需要在Django管理用户配置文件上显示它,但仅当用户属于特定组时才显示。 - CDoc

6

虽然这并不完全回答你的问题,但根据Django管理文档,你可以在User“表”中显示来自UserProfile的信息,并且可以进行搜索。

它看起来像这样(修改自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,则可能会遇到搜索问题。


3

缺少逗号不应该有影响。我怀疑问题出在您添加了一个新的admin.py文件,但开发服务器没有识别它。如果您重新启动开发服务器,它将看到新文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接