2013-03-17 17 views
11

にパスワードを変更する私は最近、Djangoのプロジェクト文書に基づいて、admin.py作成:は、Djangoの管理

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) 

[UPDATE - 追加情報] 私は、次の情報を変更し、私はまだ読み取り専用フィールドには、単にパスワード(暗号化された)を見て。パスワードを変更するためのリンクを追加する方法はありますか?

fieldsets = (
    ('Permissions', {'fields': ('is_active', 'is_admin','password')}), 
) 
add_fieldsets = (
    (None, { 
     'classes': ('wide',), 
     'fields': ('email', 'password')} 
    ), 
) 

答えて

42

あなた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>.")) 

コードはここから借り:http://hdknr.github.com/docs/django/modules/django/contrib/auth/forms.html

+1

優秀!ありがとう! – Thomas

+1

ええと、誰かがなぜ '.../user /#id/password /'にアクセスしようとしているのか知っていますか?カスタムユーザーモデルの管理フォームを取得するにはどうすればよいですか? – Dustin

+3

私の答えが見つかりました: "あなたのカスタムユーザモデルがdjango.contrib.auth.models.AbstractUserを継承している場合は、Djangoの既存のdjango.contrib.auth.admin.UserAdminクラスを使用できますが、UserモデルがAbstractBaseUserを継承する場合、カスタムModelAdminクラスを定義する必要があります。デフォルトのdjango.contrib.auth.admin.UserAdminをサブクラス化することは可能ですが、django.contrib.auth.modelsのフィールドを参照する定義をオーバーライドする必要があります.AbstractUserはあなたのカスタムUserクラスにはありません。 " – Dustin

0
('Permissions', {'fields': ('is_active', 'is_superuser',)}), 
+0

こんにちはキャサリンのために

、問題の私の更新を参照してください。私は読み取り専用フィールドでパスワードを見ることができます。しかし、私は新しいものを選択することはできません – Thomas

+0

@Thomas私はコードをトレースし、この 'ReadOnlyPasswordHashField()'のためにパスワードが読み取り専用になっていることがわかりました。ソリューションの場合は、パスワード読み取りフィールドの下にリンクを作成して、パスワードフォームにリンクしてください。 – catherine

5

を私は私の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() 

あなたはc通常はパスワードフィールドを表示しますが、管理者はハッシュされたパスワードのみを表示します。変更すると、新しい値がハッシュされ、保存されます。

これは、管理者経由でユーザーを保存するたびに1つのクエリを追加します。ほとんどのシステムには、ユーザーを集中的に編集する管理者がいないため、一般的には問題にはならないはずです。

+0

私は 'if obj.pk'ではなく' change'の値を使うことができることを知りました。これは読者に残された課題です。 ;) – WhyNotHugo

+0

それはうまくいくでしょう。ありがとうございました! – slumtrimpet

+0

これは私のために働いた。ありがとう! –

2
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>.")) 

あなたは

<a href=\"/password/\">this form</a>を使用することができますジャンゴの以前のバージョンのHREFの変化は、あります。ジャンゴ1.9+ <a href=\"../password/\">this form</a>

関連する問題