Django: 添加用户弹出窗口。缺少字段(名字,姓氏)

4
我有这样定义的UserProfile
class UserProfile(models.Model):
    user = models.OneToOneField(User)

这个模型已在后台注册。当我从UserProfile添加用户时(例如,单击用户下拉菜单旁边的+号),我会弹出一个窗口,只有电子邮件和两个密码对。

有没有办法在同一个弹窗中获取first_name和last_name?为什么它们会缺失?

注意:我在项目中使用了emailusernames应用程序。

2个回答

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')}
        ),
    )

这有点巧妙,但做得很好。


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',)
        }),
    )

注销用户

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)

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