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

问题描述 投票:4回答:2

我通过这种方式定义了UserProfile

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

此模型已在admin中注册。当我从UserProfile添加用户时(例如,在用户下拉菜单附近单击+),我会看到一个弹出窗口,其中只有电子邮件和两个密码对。有什么办法可以在同一弹出窗口中获取first_name和last_name?他们为什么失踪?

注意:我正在项目内部使用emailusernames应用程序

python django
2个回答
5
投票

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

有点hacky,但是做得很好。


0
投票

根据Django documentation,您可以扩展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)
© www.soinside.com 2019 - 2024. All rights reserved.