bueno, estoy tratando de extender el modelo predeterminado de usuario que tiene django, lo cual ya he logrado en gran medida, ahora, sucede que quiero hacer que el superuser sea capaz de cambiar el password de un usuario desde la aplicación de admin. Siendo más específico, que el campo se muestre vacío en el formulario de modificación de usuario y que si se deja vacío no se modifique el que ya tiene, pero dado el caso en que se proporcione uno nuevo, este reemplace al que ya tiene el usuario.
En el momento soy capaz mostrar el campo, pero me sale con el password hasheado.
Me preguntaba si existe algún método/función "save" como el formulario de registro que haga lo que deseo...
Mi formulario de modificación de usuario
Código Python:
Ver original
class FormularioModificacionUsuario(forms.ModelForm): # Hay alguna función/método parecido a esto? ''' def save(self, commit=True): if password: # establece el nuevo password else: # no modifica el password anterior ''' class Meta: model = Usuario fields = ('cedula', 'username', 'nombres', 'apellidos', 'direccion', 'email', 'password', 'is_active', 'is_staff',) def clean_password(self): return self.initial['password']
Mi formulario de registro de usuario...
Código Python:
Ver original
class FormularioRegistroUsuario(forms.ModelForm): password1 = forms.CharField(label='Contraseña', widget=forms.PasswordInput) password2 = forms.CharField(label='Confirmar contraseña', widget=forms.PasswordInput) class Meta: model = Usuario fields = ('cedula', 'username', 'nombres', 'apellidos', 'direccion', 'email') 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('Las contraseñas no coinciden') return password2 def save(self, commit=True): usuario = super(FormularioRegistroUsuario, self).save(commit=False) usuario.set_password(self.cleaned_data['password2']) if commit: usuario.save() return usuario
Edito:
Resulta que "parece" que si se puede, agregué esto:
Código Python:
pero al momento de guardar me sale un error que dice que el objeto no tiene atributo save (cosa que es mentira :p ya que imprimí por consola dir(usuario) y si lo tiene. Alguna idea? :) Ver original
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('Las contraseñas no coinciden') return password2 def save(self, commit=True): usuario = Usuario.objects.get(cedula=self.cleaned_data['cedula']) if self.cleaned_data['password2']: usuario.set_password(self.cleaned_data['password2']) #..aquí las demás asignaciones a usuario... usuario.save()