En creusant dans le code source, j'ai trouvé la fonction save()
pour appeler la méthode(Model Instance) du modèle save()
méthode. Vérifier ici.
Il est maintenant clair que la première fonction de ModelForm save()
est appelé et à l'intérieur de celui-ci (en fonction de la valeur du commit), le modèle save()
est appelé.
Il convient également de noter que dans le code :
def save(self, commit = True):
user = super(RegisterForm, self).save(commit = False)
user.set_password(self.cleaned_data["password1"])
#When you're hashing and setting the password to the user variable,
#this user variable is a Model Object but is not saved in the database yet.
if commit:
user.save()
#Now in the above line you're ultimately calling the save method of Model instance.
return user
La question se pose donc à vous.
Voulez-vous aller encore plus loin dans les couches d'abstraction (en surchargeant la méthode save de l'instance de modèle) des modèles django ?
Avez-vous vraiment besoin de le faire ?
L'abstraction est l'un des éléments constitutifs de l'OOPS. Ainsi, jusqu'à ce qu'un besoin se fasse sentir qui vous oblige à aller plus haut dans les couches d'abstraction, pourquoi le faire ? Il est clair que le mot de passe peut être haché dans le formulaire ModelForm. save()
méthode.
De même, si l'on passe à un niveau d'abstraction supérieur, que se passe-t-il si un comportement inattendu se produit à l'avenir ?
À mon avis, pourquoi ne pas le laisser à l'intérieur du ModelForm ? Nous partons de la couche d'abstraction la plus élevée lorsque nous commençons à utiliser django (nous appelons simplement les méthodes et ne savons généralement pas ce qui se passe dans les classes dont nous héritons ; c'est à cela que sert oops). et nous n'allons au-delà que lorsqu'un besoin spécifique se fait sentir.
J'espère que cela vous guidera d'une manière ou d'une autre. Je vous remercie.