Sto tentando di aggiungere la convalida della password personalizzata all'utente di creazione e modificare i moduli di amministrazione della password. Non ho visto nulla nei documenti del django su come farlo. Ho trovato questo post su SO: Enforcing password strength requirements with django.contrib.auth.views.password_change, che fornisce 2 soluzioni. Ho provato entrambi, ma nessuno dei due ha funzionato.convalida password personalizzata in django 1.7
Ecco quello che ho adesso nel mio app admin.py:
def validate_password_strength(value):
"""Validates that a password is as least 10 characters long and has at least
2 digits and 1 Upper case letter.
"""
min_length = 10
if len(value) < min_length:
raise ValidationError(_('Password must be at least {0} characters '
'long.').format(min_length))
# check for 2 digits
if sum(c.isdigit() for c in value) < 2:
raise ValidationError(_('Password must container at least 2 digits.'))
# check for uppercase letter
if not any(c.isupper() for c in value):
raise ValidationError(_('Password must container at least 1 uppercase letter.'))
class MySetPasswordForm(SetPasswordForm):
def __init__(self, *args, **kwargs):
super(MySetPasswordForm, self).__init__(*args, **kwargs)
self.fields['password1'].validators.append(validate_password_strength)
Ma quello che non riesco a capire è come faccio a MySetPasswordForm da utilizzare.
Ho provato alcune cose diverse. Per prima cosa ho fatto questo:
class UserAdmin(UserAdmin):
form = MySetPasswordForm
# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
E ho ottenuto questo errore:
<class 'elex_apis.energy.webservice.admin.UserAdmin'>: (admin.E016) The value of 'form' must inherit from 'BaseModelForm'.
Così poi ho cambiato MySetPasswordForm ereditare da BaseModelForm e poi ho ottenuto questo errore:
__init__() missing 1 required positional argument: 'user'
Allora Ho aggiunto il parametro utente in modo che ora MySetPasswordForm assomigli a questo:
class MySetPasswordForm(BaseModelForm):
def __init__(self, user, *args, **kwargs):
super(MySetPasswordForm, self).__init__(user, *args, **kwargs)
self.fields['password1'].validators.append(validate_password_strength)
Ma ho ancora lo stesso errore di prima.
Non riesco a credere che sia così difficile aggiungere un validatore di password. Deve essere un bisogno molto comune, quindi chiaramente mi manca qualcosa di semplice. Qualcuno può fornire assistenza qui.
Questo fa convalidare la password, ma quando dopo una password valida è iscritto e di amministrazione torna alla pagina precedente, si dice Tuttavia quando guardo nel database c'è una password in auth_user. –
@LarryMartell: oops ... ha dimenticato di aggiungere il 'valore restituito', prova con la nuova versione :) – Wolph
Perfetto! Grazie mille!! –