django-admin中的新字段添加用户

时间:2014-11-26 13:50:56

标签: python django django-admin

我正在使用Django 1.7.1,在这里我遇到了一个不应该发生的问题。

背景:我正在研究基于AbstractUser的自定义用户模型。现在 - 我已经有一个额外的领域(用于测试)并计划增加更多。不知何故,我设法使用带有Meta类的UserChangeForm与DjangoAdmin一起工作。

问题:根据Django-docs,没有必要再做任何事情来获得查看,编辑和增加我的DjangoAdmin网站中每个字段的价值的可能性。不幸的是 - 看到和编辑工作正如预期的那样,但是当涉及到#34;添加新用户"通过DjangoAdmin - 我仍然只看到三个字段:"用户名","密码"和#34;密码确认"。

问题:在我通过DjangoAdmin创建新用户时,我应该在哪里编辑/放置一些代码以获得填充更多字段的可能性?

结束:是的 - 我已经尝试了很多谷歌搜索结果(包括使用' fieldsets',' list_display',' inline'方法等..同样,尽可能 - 我也想避免使用OneToOne与User模型的关系。这产生了很多错误,我放弃了它,我不想回到那里。如果有这样的话。需要 - 我将提供代码段。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我不确定问题是否与NewUserAdmin类中的特定行顺序或其他内容有关 - 尚未对其进行测试,但我很确定我之前更接近此解决方案。然而,这是我正在谈论的确切事情(它按照我想要的方式工作:))。我现在可以轻松地将任何字段添加到用户模型,它仍然连接到所有框架功能,如会话管理,等等。更重要的是 - 我不使用AbstractBaseUser也不使用OneToOne字段,这会导致很多问题。无论如何 - 感谢任何帮助。没有你我不会解决它......本周:D

PS我跳过所有进口。 IDE会告诉你,需要什么。

models.py

class NewUserManager(UserManager):
def create_user(self, username, email=None, password=None, **extra_fields):
    return UserManager.create_user(self, username, email=email, password=password, **extra_fields)

def create_superuser(self, username, email, password, **extra_fields):
    return UserManager.create_superuser(self, username, email, password, **extra_fields)

class NewUser(AbstractUser):
    newField = models.CharField()       # for example CharField
    newField = models.CharField(max_length = 12) # important thing - properties should be in the second line
    objects = NewUserManager()

    class Meta(AbstractUser.Meta):
        swappable = 'your_app_name.NewUser'
        #db_table = 'auth_user'    

forms.py

class NewUserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = NewUser
        fields = ('username', 'email', 'first_name', 'last_name', 'newField')       # few example fields and new one: newField

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        user = super(NewUserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

class NewUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = NewUser
        fields = ('username', 'email', 'first_name', 'last_name', 'newField', 'last_login', 'is_staff')     # few example fields and new one: newField    

admin.py

class NewUserAdmin(UserAdmin):
    form = NewUserChangeForm
    add_form = NewUserCreationForm

    list_display = ('username', 'newField', 'first_name', 'last_name', 'last_login',)       # few example fields and new one: newField
    fieldsets = (
        (None, {'fields': ('username', 'email', 'first_name', 'last_name', 'newField', 'last_login', 'is_staff')}), # few example fields and new one: newField
)

    add_fieldsets = (
        (None, {
        'classes': ('wide',),
        'fields': ('username', 'newField', 'password1', 'password2')}   # here are fields you want to have in django-admin AddUser view
    ),           # one of the most important place above
)

admin.site.register(NewUser, NewUserAdmin)