Recentemente ho creato l'admin.py sede nel progetto di documento Django:Cambiare la password in Django Admin
https://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser
Ma ho davvero perso la funzionalità che permettono all'amministratore la possibilità di modificare le password degli utenti. Come è possibile aggiungere questa funzionalità? Ho appena copiato e incollato il codice che si trova nel link sopra.
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 - Concessionari Informazione] ho cambiato le seguenti informazioni, ma ho ancora vedere solo la password (criptato) in un campo di sola lettura. Come è possibile aggiungere un link per cambiare la password?
fieldsets = (
('Permissions', {'fields': ('is_active', 'is_admin','password')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'password')}
),
)
Eccellente! Grazie! – Thomas
Hmmm, qualcuno sa perché ottengo un 404 che prova ad accedere a .../user/# id/password/'? Cosa devo fare per ottenere questo modulo di amministrazione per il mio modello utente personalizzato? – Dustin
Trovato la mia risposta: "Se il modello utente personalizzato estende django.contrib.auth.models.AbstractUser, è possibile utilizzare la classe django.contrib.auth.admin.UserAdmin esistente di Django, tuttavia, se il modello utente estende AbstractBaseUser, è necessario definire una classe ModelAdmin personalizzata. Potrebbe essere possibile eseguire la sottoclasse del django.contrib.auth.admin.UserAdmin predefinito, tuttavia, sarà necessario eseguire l'override delle definizioni che fanno riferimento ai campi su django.contrib.auth.models .AbstractUser che non sono nella tua classe utente personalizzata. " – Dustin