在Django Admin中更改密码

Tho*_*mas 14 python django django-admin django-1.5

我最近在Django项目文档中创建了admin.py:

https://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser

但我真的错过了允许管理员更改用户密码的功能.如何添加此功能?我只是复制并粘贴了上面链接中的代码.

from django import forms
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField

from customauth.models import MyUser


class UserCreationForm(forms.ModelForm):
    """A form for creating new users. Includes all the required
    fields, plus a repeated password."""
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = MyUser
        fields = ('email', 'date_of_birth')

    def clean_password2(self):
        # Check that the two password entries match
        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):
        # Save the provided password in hashed format
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class UserChangeForm(forms.ModelForm):
    """A form for updating users. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    """
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = MyUser

    def clean_password(self):
        # Regardless of what the user provides, return the initial value.
        # This is done here, rather than on the field, because the
        # field does not have access to the initial value
        return self.initial["password"]


class MyUserAdmin(UserAdmin):
    # The forms to add and change user instances
    form = UserChangeForm
    add_form = UserCreationForm

    # The fields to be used in displaying the User model.
    # These override the definitions on the base UserAdmin
    # that reference specific fields on auth.User.
    list_display = ('email', 'date_of_birth', 'is_admin')
    list_filter = ('is_admin',)
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('date_of_birth',)}),
        ('Permissions', {'fields': ('is_admin',)}),
        ('Important dates', {'fields': ('last_login',)}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'date_of_birth', 'password1', 'password2')}
        ),
    )
    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ()

# Now register the new UserAdmin...
admin.site.register(MyUser, MyUserAdmin)
# ... and, since we're not using Django's builtin permissions,
# unregister the Group model from admin.
admin.site.unregister(Group)
Run Code Online (Sandbox Code Playgroud)

[更新 - 添加信息] 我更改了以下信息,但我仍然只在只读字段中看到密码(加密).如何添加更改密码的链接?

fieldsets = (
    ('Permissions', {'fields': ('is_active', 'is_admin','password')}),
)
add_fieldsets = (
    (None, {
        'classes': ('wide',),
        'fields': ('email', 'password')}
    ),
)
Run Code Online (Sandbox Code Playgroud)

kuf*_*udo 52

把它放在你的UserChangeForm中:

password = ReadOnlyPasswordHashField(label= ("Password"),
        help_text= ("Raw passwords are not stored, so there is no way to see "
                    "this user's password, but you can change the password "
                    "using <a href=\"password/\">this form</a>."))
Run Code Online (Sandbox Code Playgroud)

从这里借来的代码:http://hdknr.github.com/docs/django/modules/django/contrib/auth/forms.html

  • 同意.我只需要改变这一行的最后一行:```'使用<a href=\'../password/\'>这个形式</a>.在`django 1.9.1中注意'注意**````````**'密码'之前 (13认同)
  • 找到我的答案:"如果你的自定义用户模型扩展了django.contrib.auth.models.AbstractUser,你可以使用Django现有的django.contrib.auth.admin.UserAdmin类.但是,如果你的用户模型扩展了AbstractBaseUser,你需要定义一个自定义的ModelAdmin类.可以将默认的django.contrib.auth.admin.UserAdmin子类化;但是,您需要覆盖引用django.contrib.auth.models上的字段的任何定义.不在您的自定义用户类上的AbstractUser." (4认同)

Yas*_*ogi 12

password = ReadOnlyPasswordHashField(label= ("Password"),
        help_text= ("Raw passwords are not stored, so there is no way to see "
                    "this user's password, but you can change the password "
                    "using <a href=\"../password/\">this form</a>."))
Run Code Online (Sandbox Code Playgroud)

href有变化,你可以使用以前版本的django

<a href=\"/password/\">this form</a>.

对于django 1.9+ <a href=\"../password/\">this form</a>


Why*_*ugo 7

我把这个方法添加到我的UserAdmin班级:

def save_model(self, request, obj, form, change):
    # Override this to set the password to the value in the field if it's
    # changed.
    if obj.pk:
        orig_obj = models.User.objects.get(pk=obj.pk)
        if obj.password != orig_obj.password:
            obj.set_password(obj.password)
    else:
        obj.set_password(obj.password)
    obj.save()
Run Code Online (Sandbox Code Playgroud)

您可以正常显示密码字段,但管理员只能看到哈希密码.如果他们改变了它,则对新值进行散列并保存.

每次通过管理员保存用户时,都会添加一个查询.它通常不应该是一个问题,因为大多数系统没有管理员密集编辑用户.