Comment puis-je passer un modèle utilisateur dans un champ de formulaire (django)?
-
20-09-2019 - |
Question
En fait, je dois utiliser le hachage de mot de passe de l'utilisateur pour chiffrer des données via un champ de modèle personnalisé. Consultez l'extrait je ici. Django cryptage
J'ai essayé ceci:
class MyClass(models.Model): owner = models.ForeignKey(User) product_id = EncryptedCharField(max_length=255, user_field=owner) ................................................................................. def formfield(self, **kwargs): defaults = {'max_length': self.max_length, 'user_field': self.user_field} defaults.update(kwargs) return super(EncryptedCharField, self).formfield(**defaults))
Mais quand j'essaie d'utiliser user_field, je reçois une instance ForeignKey (bien sûr!):
user_field = kwargs.get('user_field') cipher = user_field.password[:32]
Toute aide est appréciée!
La solution
peut-être quelque chose comme cela - remplacer la méthode save () où vous pouvez appeler la méthode Encrypt
.pour Décrypter vous pouvez utiliser post_init , donc chaque fois que vous instancier le modèle à partir de la base de données du champ product_id est décrypté automatiquement
class MyClass(models.Model):
user_field = models.ForeignKey(User)
product_id = EncryptedCharField()
...other fields...
def save(self):
self.product_id._encrypt(product_id, self.user_field)
super(MyClass,self).save()
def decrypt(self):
if self.product_id != None:
user = self.user_field
self.product_id._decrypt(user=user)
def post_init_handler(sender_class, model_instance):
if isinstance(model_instance, MyClass):
model_instance.decrypt()
from django.core.signals import post_init
post_init_connect.connect(post_init_handler)
obj = MyClass(user_field=request.user)
#post_init will be fired but your decrypt method will have
#nothing to decrypt, so it won't garble your input
#you'll either have to remember not to pass value of crypted fields
#with the constructor, or enforce it with either pre_init method
#or carefully overriding __init__() method -
#which is not recommended officially
#decrypt will do real decryption work when you load object form the database
obj.product_id = 'blah'
obj.save() #field will be encrypted
peut-être il y a un moyen « pythonique » plus élégante de le faire
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow