2010-10-21 6 views
12

Ich versuche, ein verschlüsseltes Zeichenfeld zu implementieren.Das benutzerdefinierte Feld to_python funktioniert nicht? - Django


Ich verwende pydes für die Verschlüsselung

Dies ist, was ich habe:

from pyDes import triple_des, PAD_PKCS5 
from binascii import unhexlify as unhex 
from binascii import hexlify as dohex 

class BaseEncryptedField(models.CharField): 

    def __init__(self, *args, **kwargs): 
     self.td = triple_des(unhex('c35414909168354f77fe89816c6b625bde4fc9ee51529f2f')) 
     super(BaseEncryptedField, self).__init__(*args, **kwargs) 

    def to_python(self, value): 
     return self.td.decrypt(unhex(value), padmode=PAD_PKCS5) 

    def get_db_prep_value(self, value): 
     return dohex(self.td.encrypt(value, padmode=PAD_PKCS5)) 

Das Feld in der Datenbank erfolgreich verschlüsselt gespeicherten wird

aber wenn retireved Es wird die entschlüsselte Version

nicht ausgedruckt

Irgendwelche Ideen?

Antwort

16

Sie haben die Metaklasse zu setzen vergessen:

class BaseEncryptedField(models.CharField): 

    __metaclass__ = models.SubfieldBase 

    ... etc ... 

Als the documentation explains wird to_python nur aufgerufen, wenn die SubfieldBase Metaklasse verwendet wird.

+2

wow! Vielen Dank! Ich bin so glücklich :) – RadiantHex

+1

Ich denke, diese Antwort ist jetzt für die neuesten Versionen von Django veraltet. –

Verwandte Themen