在Django管理员编辑用户表单中删除/隐藏用户名字段

5
前端用户注册表格中没有用户名字段,因为我使用电子邮件进行登录。现在我可以访问Django管理后台。当我编辑一个用户时,我会看到可以编辑用户名字段,但是我不想让该字段可编辑或可见。在admin.py文件中:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from .models import UserProfile

class ProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'Profile'
    fk_name = 'user'

class CustomUserAdmin(UserAdmin):
    inlines = (ProfileInline, )
    list_display = ('email', 'first_name', 'last_name', 'is_staff')
    list_select_related = ('profile', )

    exclude = ('username',)

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(CustomUserAdmin, self).get_inline_instances(request, obj)


admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

forms.py --

from django import forms
from django.contrib.auth.models import User
from django.utils.translation import ugettext as _
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div, Field
from ajax_select.fields import AutoCompleteSelectField, AutoCompleteField
from phonenumber_field.formfields  import PhoneNumberField
from . import models
from captcha.fields import ReCaptchaField


class SignUpForm(forms.Form):
    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    phone_number = PhoneNumberField(label=_("Phone (Please state your country code eg. +44)"))
    organisation = forms.CharField(max_length=50)
    email = forms.EmailField()
    password1 = forms.CharField(max_length=20)
    password2 = forms.CharField(max_length=20)
    captcha = ReCaptchaField(attrs={'theme' : 'clean'})

models.py--

from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext as _
from easy_thumbnails.fields import ThumbnailerImageField
from ciasroot.settings import THUMBNAILER_SIZES, UPLOAD_PATH
from ciasroot.constants import GENDERS, LANGUAGES
from ciasroot.util import HashedPk
from phonenumber_field.modelfields import PhoneNumberField
import math, decimal, datetime, os


class UserProfile(models.Model, HashedPk):
    user = models.OneToOneField(User, unique=True, related_name ='profile')
 job_title = models.CharField(max_length=128, blank=True, null=False, default="")
    website = models.URLField(max_length=255, blank=True, null=True)
    organisation = models.CharField(max_length=50, blank=True, null=True, default="")
    phone_number = PhoneNumberField( blank=True, null=True)

版本为1.10的Django,因此我使用了exclude。但是它会抛出一个错误——
KeyError: "Key 'username' not found in 'UserForm'. Choices are: date_joined, email, first_name, groups, is_active, is_staff, is_superuser, last_login, last_name, password, user_permissions."

我需要重写注册表单吗?因为当我从管理员添加新用户时,我没有像前端注册表单那样的字段(在某些情况下,我也需要这样做)。

非常感谢您的帮助。


UserProfile 模型中是否有 username 字段?如果是,则将 exclude 属性设置为 ProfileInline,而不是 CustomUserAdmin - Anton Shurashov
UserProfile 模型中没有 username 字段。 - Prithviraj Mitra
但是 username 字段在哪里呢?请展示您的模型。 - Anton Shurashov
我正在使用allauth应用程序,在settings.py中设置ACCOUNT_USERNAME_REQUIRED = False,并且allauth与django默认管理界面无关。我将在我的帖子中更新模型。 - Prithviraj Mitra
@AntonShurashov 帖子已更新。 - Prithviraj Mitra
1个回答

13

关于这个问题的讨论在这里

简单来说:

这是因为默认的UserAdmin在fieldsets中定义了“username”字段,您需要同时修改fieldsets。

例如:

class CustomUserAdmin(UserAdmin):
    # ...
    exclude = ('username',)
    fieldsets = (
        ('Personal info', {'fields': ('full_name', 'email', 'password')}),
        ('Important dates', {'fields': ('last_login', 'date_joined')}),
        ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
    )

太棒了,它运行成功了。答案被接受了。有没有办法可以对栈进行排序,比如个人信息、重要日期等? - Prithviraj Mitra

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