django:添加用户弹窗。缺少字段(名,姓)
我定义了一个用户资料(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.UserChangeForm
和 django.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')}
),
)
这有点小技巧,但效果很好。