在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_name
,email
,first_name
和last_name
字段。在clean(self)
中,我检查输入的密码是否匹配以及它们是否有效。
我现在要做的是设置我的模型password_hash
的{{1}}和password_salt
。怎么办呢?
答案 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()
如果您正在寻找手动创建/管理密码,我认为这可能是您正在寻找的:
make_password(密码[,盐,哈希])
以此应用程序使用的格式创建散列密码。它需要一个强制参数:明文密码。 (可选)如果您不想使用默认值(PASSWORD_HASHERS设置的第一个条目),则可以提供salt和哈希算法。目前支持的算法是:'pbkdf2_sha256','pbkdf2_sha1','bcrypt_sha256'(参见使用带有Django的bcrypt),'bcrypt','sha1','md5','unsalted_md5'(仅用于向后兼容)和'crypt'如果你已经安装了crypt库。如果password参数为None,则返回一个不可用的密码(check_password()将永远不会接受该密码。)