如何在Meta类中未定义的模型中设置字段

时间:2017-05-27 17:30:26

标签: python django

django中,我们如何设置class Meta中未定义的字段?

我有这个型号:

class User(models.Model):
    user_name = models.CharField(max_length=32, unique=True)
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=32)
    password_hash = models.CharField(max_length=64)
    password_salt = models.CharField(max_length=64)

以及此表格:

class ContactForm(ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    repeat_password = forms.CharField(widget=forms.PasswordInput())

    class Meta:
        model = User
        fields = ['user_name', 'email', 'first_name', 'last_name']

    def clean(self):
        cleaned_data = super(ContactForm, self).clean()
        password = cleaned_data.get('password')
        repeat_password = cleaned_data.get('repeat_password')

        if password is not None and repeat_password is not None:
            if password != repeat_password:
                raise forms.ValidationError("Passwords do not match.")

            password_validate = password_validate = password_validation.validate_password(password)
            if password_validate is not None:
                raise password_validate

我只希望用户能够设置user_nameemailfirst_namelast_name字段。在clean(self)中,我检查输入的密码是否匹配以及它们是否有效。

我现在要做的是设置我的模型password_hash的{​​{1}}和password_salt。怎么办呢?

1 个答案:

答案 0 :(得分:1)

ModelForm中的clean方法仅验证表单中的字段。 它不会为模型设置任何数据。您在干净方法中所做的是,您正在检查发布的数据是否符合您预期或预期的格式。您可以在in the docs..

中查看更多信息

对于“设置”字段,如您所说,您可能需要覆盖表单保存方法。 Here in the docs..

  

save()方法¶

     

每个ModelForm也有一个save()方法。此方法根据绑定到表单的数据创建并保存数据库对象。 ModelForm的子类可以接受现有的模型实例作为关键字参数实例;如果提供了这个,save()将更新该实例。

根据我的理解,你可以做这样的事情,

def save(self, commit=True):
    instance = super(ContactForm, self).save(commit=False)
    instance.password_hash = #...How you want to do your password_hash is here.
    instance.save()

如果您正在寻找手动创建/管理密码,我认为这可能是您正在寻找的:

Setting passwords manually

  

make_password(密码[,盐,哈希])

     

以此应用程序使用的格式创建散列密码。它需要一个强制参数:明文密码。 (可选)如果您不想使用默认值(PASSWORD_HASHERS设置的第一个条目),则可以提供salt和哈希算法。目前支持的算法是:'pbkdf2_sha256','pbkdf2_sha1','bcrypt_sha256'(参见使用带有Django的bcrypt),'bcrypt','sha1','md5','unsalted_md5'(仅用于向后兼容)和'crypt'如果你已经安装了crypt库。如果password参数为None,则返回一个不可用的密码(check_password()将永远不会接受该密码。)