将变量传递给自定义模型字段

时间:2011-10-19 22:55:43

标签: django django-models

是否可以将值传递给自定义模型字段的init?

示例代码:

class Example(models.Model):
    user = models.ForeignKey(User)
    text = EncryptedCharField('Text',max_length=255)

class BaseEncryptedField(models.Field):
    def __init__(self, *args, **kwargs):
        self.cipher = AES.new(key)
        models.Field.__init__(self, *args, **kwargs)            

    def to_python(self, value):
        if isinstance(value, EncryptedString):
            return self.cipher.decrypt(binascii.a2b_base64(str(value))).split(EOD)[0]
        return value

    def get_db_prep_value(self, value):
        if value is not None and not isinstance(value, EncryptedString):
            saltlength = self.cipher.block_size - (len(value) + len(EOD)) % self.cipher.block_size
            if saltlength:
               value = ''.join([value,EOD,generate_salt(saltlength)])
            value = EncryptedString(binascii.b2a_base64(self.cipher.encrypt(value)))
        return value    

在init函数中,我想传递一个密钥(存储在用户配置文件中并根据用户而改变)来设置AES密码,但我似乎无法弄清楚如何把它拿进来。

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的问题...但是这里有。

如果将参数传递给模型的构造函数( init ),它将在“args”集合中可用。您还可以将参数作为映射传递(因此您可以通过名称通过kwargs访问它们)。

所以你应该做像args [0]这样的事情来获取你的密钥。 (不能确切地记住第一个传递的参数是否在索引0或1处,你总是可以尝试它/ debug =))

答案 1 :(得分:0)

试试这个。在类示例中:

text = EncryptedCharField('Text', max_length=255, key=pass_the_user's_key_here)

然后在BaseEncryptedField。 init

self.cipher = AES.new(kwargs['key'])