2 votes

Django save() overriding, best practice : on model, form or view ?

J'ai réussi à hacher les mots de passe de mon modèle d'utilisateur personnalisé en surchargeant la fonction save() comme suit :

def save(self, commit = True): 
    user = super(RegisterForm, self).save(commit = False)
    user.set_password(self.cleaned_data["password1"])
    if commit:
        user.save()
    return user

Mais j'ai placé cette surcharge dans la définition de mon formulaire de registre, et il m'est venu à l'esprit que je pourrais également le faire dans la définition du modèle Utilisateur, ou dans mon modèle register() vue.

Existe-t-il un endroit "correct" pour remplacer ces fonctions, comme par exemple clean() o save() ? Y a-t-il une différence pratique ?

ps : Je ne suis pas intéressé par l'utilisation des vues ou formulaires de changement de mot de passe et d'enregistrement par défaut de Django.

3voto

Shivam Sharma Points 696

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X