Comment puis-je changer un Django forme de valeur de champ avant de l'enregistrer?
if request.method == 'POST':
userf = UsersModelForm(request.POST)
username = userf.data['username']
password = userf.data['password']
passwordrepeat = userf.data['passwordrepeat']
email = userf.data['email']
J'ai essayé ceci:
tempSalt = bcrypt.gensalt()
password = bcrypt.hashpw(password,tempSalt)
passwordrepeat = bcrypt.hashpw(passwordrepeat,tempSalt)
userf.data['password'] = password
userf.data['passwordrepeat'] = passwordrepeat
Mais je suis d'erreur. Comment puis-je changer la valeur de userf.data['password']
et userf.data['passwordrepeat']
avant de l'enregistrer?
Erreur:
AttributeError at /register
This QueryDict instance is immutable
Request Method: POST
Request URL: http://127.0.0.1:8000/register
Django Version: 1.3.1
Exception Type: AttributeError
Exception Value:
This QueryDict instance is immutable
Exception Location: /usr/local/lib/python2.6/dist-packages/django/http/__init__.py in _assert_mutable, line 359
Python Executable: /usr/bin/python
Python Version: 2.6.6
Python Path:
['/home/user1/djangoblog',
'/usr/lib/python2.6',
'/usr/lib/python2.6/plat-linux2',
'/usr/lib/python2.6/lib-tk',
'/usr/lib/python2.6/lib-old',
'/usr/lib/python2.6/lib-dynload',
'/usr/local/lib/python2.6/dist-packages',
'/usr/lib/python2.6/dist-packages',
'/usr/lib/python2.6/dist-packages/gst-0.10',
'/usr/lib/pymodules/python2.6',
'/usr/lib/pymodules/python2.6/gtk-2.0']
- Ce type d'erreur avez-vous ? Erreur de Validation, erreur d'intégrité ? Vous devez toujours poster le message d'erreur. TOUJOURS.
- J'ai mis à jour l'erreur, voir que de nouveau à comprendre.
- Nous avons besoin de ce que vous voulez faire ainsi: définir une valeur par défaut, définissez une valeur si pas de valeur existent, corriger une valeur si elle n'est pas bien, etc. Il y a plusieurs hameçons sur django formes.
- J'ai mis à jour le post original/question. Voir que de nouveau à comprendre.
- Il ne nous dit pas ce que vous voulez faire, il raconte utiliser ce que vous faites. Quel résultat voulez-vous ? Pas au niveau de la programmation, au niveau de la fonction.
- Vous pouvez utiliser le django interne de la fonction de hachage
django.contrib.auth.hashers.make_password
au lieubcrypt.hashpw
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin de faire quelque chose pour les données avant de les enregistrer, il suffit de créer une fonction comme:
Tous vous avez besoin est de créer une fonction avec le nom **clean_***nameofdata* où nameofdata est le nom du champ, donc si vous voulez modifier le mot de passe de domaine, vous avez besoin de:
si vous avez besoin de modifier passwordrepeat
Donc à l'intérieur de là, il suffit de crypter votre mot de passe et le retour de la chiffré.
Je veux dire:
ainsi, lorsque vous valide le formulaire, le mot de passe est crypté.
def clean_password(self):
fonctions?Consultez la documentation du
save()
méthodeVous aurez des problèmes si vous avez besoin de remplir un formulaire à partir d'AFFICHER, de modifier tout champ de formulaire, la valeur et le rendu de formulaire à nouveau.
Voici la solution pour elle:
Et puis:
Remplacer
_clean
méthodes et de mettre vos chèques dans leur. Vous pouvez modifiercleaned_data
à partir de là.E. g:
Tous les champs dans le formulaire va avoir une
field_name_clean()
méthode créée automatiquement par Django. Cette méthode est appelée lorsque vous neform.is_valid()
.clean_passwor(self):
fonction appelée?Le problème avec les solutions précédentes, c'est qu'elle ne fonctionnera pas si la validation échoue. Afin d'éviter de validation, vous pouvez utiliser l'exemple:
Mais attention, cela ne permet pas de vérifier
is_valid()
. Si vous voulez le faire, vous pouvez instancier le formulaire avec les nouvelles valeurs: