django:添加用户弹窗。缺少字段(名,姓)

4 投票
2 回答
1032 浏览
提问于 2025-04-19 23:41

我定义了一个用户资料(UserProfile),如下所示:

class UserProfile(models.Model):
    user = models.OneToOneField(User)

这个模型已经在管理后台注册了。当我从用户资料中添加一个用户(比如点击用户下拉菜单旁边的 + 号)时,会弹出一个窗口,只显示电子邮件和两个密码的输入框。 有没有办法在同一个弹窗中显示名字(first_name)和姓氏(last_name)呢?为什么它们会缺失呢?

注意:我在项目中使用了 emailusernames 这个应用。

2 个回答

0

根据Django的文档,你可以扩展UserAdmin

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User


class UserAdmin(BaseUserAdmin):
    add_fieldsets = BaseUserAdmin.add_fieldsets + (
        (None, {
            'fields': ('first_name', 'last_name',)
        }),
    )

并且可以取消注册User

admin.site.unregister(User)

然后用新的UserAdmin重新注册

admin.site.register(User, UserAdmin)

你还可以在UserAdmin中添加UserProfile

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


class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'user profile'


class UserAdmin(BaseUserAdmin):
    inlines = (UserProfileInline,)

    add_fieldsets = BaseUserAdmin.add_fieldsets + (
        (None, {
            'fields': ('first_name', 'last_name',)
        }),
    )

admin.site.unregister(User)
admin.site.register(User, UserAdmin)
6

你可以尝试在 admin/auth/user/add/ 这个地址添加用户。你会看到一个弹出窗口,里面有填写用户名和密码的表单。创建用户后,你会被引导到新创建的用户页面,在那里你可以填写其他信息。

可以看看 Django 管理后台的模板源代码:

{% block form_top %}
  {% if not is_popup %}
    <p>{% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}</p>
  {% else %}
    <p>{% trans "Enter a username and password." %}</p>
  {% endif %}
{% endblock %}

这告诉我们,默认情况下,你可以在创建对象后添加更多信息。

这里还有两个表单:django.contrib.auth.forms.UserChangeFormdjango.contrib.auth.forms.UserCreationForm

它们传达的意思是一样的。

django.contrib.auth.admin.UserAdmin 中,把 add_fieldsets 替换为:

add_fieldsets = (
    (None, {
        'classes': ('wide',),
        'fields': ('username', 'password1', 'password2', 'first_name', 'last_name')}
    ),
)

这样可以得到结果,但这并不好,因为我们在修改 Django 的源代码。

所以在我的 admin.py 文件中,我写了这个:

from django.contrib.auth.admin import UserAdmin
UserAdmin.add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2', 'first_name', 'last_name')}
        ),
    )

这有点小技巧,但效果很好。

撰写回答