gpt4 book ai didi

python - 用于创建 AbstractUser 扩展模型的 Django 管理表单

转载 作者:行者123 更新时间:2023-11-28 20:45:23 24 4
gpt4 key购买 nike

我有一个扩展/继承 AbstractUser 的客户用户模型。我还希望管理员中的用户创建表单匹配,但出于某种原因我只能让它显示用户名和密码字段。没有其他的。

我发现特别有趣的是,我对 admin.py 中的这 3 个字段所做的更改反射(reflect)在创建表单中,但其他字段从未显示。因此,例如,我可以更改密码 1 的帮助文本或标签,并在表单中呈现它,但其他字段不会。

此外,如果我设置扩展 UserAdmin 并注册它(如下面的代码所示),我将获得通用用户的 3 字段创建 View ,但如果我扩展 ModelAdmin,我将获得所有字段,但无法使用密码更新表单。它 404s。

还值得注意的是,指向对象列表的链接是“User”,而不是我的模型所调用的“CommonUser”,但这可能是某处的类元。


admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from models import CommonUser, Account, Registry
from django import forms


class MyUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = CommonUser


class MyUserCreationForm(UserCreationForm):

password = forms.CharField(
label='Password',
max_length = 32,
required=True,
widget=forms.PasswordInput,
)

password2 = forms.CharField(
label='Confirm',
max_length = 32,
required=True,
widget=forms.PasswordInput,
help_text="Make sure they match!",
)


class Meta(UserCreationForm.Meta):
model = CommonUser
fields = ['username', 'password', 'password2', 'email',
'first_name','last_name','address','city','state','zipcode',
'phone1','phone2',]
help_texts = {
'password': 'Must be at least 8 characters.',
}


def clean_username(self):
username = self.cleaned_data['username']
try:
CommonUser.objects.get(username=username)
except CommonUser.DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate_username'])


class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
add_form = MyUserCreationForm
fieldsets = UserAdmin.fieldsets + (
('Personal info', {'fields': ('address', 'phone1',)}),
)

admin.site.register(CommonUser, MyUserAdmin)

(片段)model.py

from django.contrib.auth.models import AbstractUser

class CommonUser(AbstractUser):
"User abstraction for carrying general info."

WORK_STATES = (
('FL', 'FL'),
)

address = models.CharField(max_length=50)
city = models.CharField(max_length=30)
state = models.CharField(max_length=2, default='FL', choices=WORK_STATES)
zipcode = models.CharField(max_length=10)
phone1 = models.CharField(max_length=15)
phone2 = models.CharField(max_length=15, null=True)
gets_email_updates = models.BooleanField(default=False)

来源

Extending new user form, in the admin Django Using Django auth UserAdmin for a custom user model https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#a-full-example

最佳答案

django.contrib.auth.admin 中的 UserAdmin 还设置了“add_fieldsets”属性,该属性设置要在添加用户 View 中显示的字段。由于 UserAdmin 设置了该字段,您需要覆盖它以设置您自己的字段。

这是一个例子:

class CustomUserAdmin(UserAdmin):
# ...code here...

fieldsets = (
(None, {'fields': ('email',)}),
(_('Personal info'), {'fields': ('first_name', 'last_name')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
'groups', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'first_name', 'last_name', 'password1',
'password2')}
),
)

希望这对您有所帮助!

关于python - 用于创建 AbstractUser 扩展模型的 Django 管理表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23697130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com