我试图使用set_password()函数但是这个错误
'Member' object has no attribute 'set_password'
当我使用它时会出现。如果我取出set_password()函数,密码将存储在数据库中,但不会被散列。
view.py
user = Member(username=u, password=p, email=e, security=s)
user.set_password(p)
user.save()
models.py
class Member(models.Model):
username = models.CharField(max_length=16,primary_key=True)
password = models.CharField(max_length=16)
email = models.CharField(max_length=325)
security = models.CharField(max_length=16)
profile = models.OneToOneField(Profile, null=True)
following = models.ManyToManyField("self", symmetrical=False)
from_member_id = models.CharField(max_length=16)
def __str__(self):
return self.username
答案 0 :(得分:4)
set_password
不会自动提供models.Model
功能。
您必须自己定义它或从django Usermodel
Member
答案 1 :(得分:2)
providing your own user model上的文档非常清晰和全面。除此之外,您的模型必须是AbstractBaseUser的子类,它提供set_password
方法。
另请注意,16个字符的长度不足以存储散列的盐渍密码。
答案 2 :(得分:1)
正如错误消息所示,未定义方法set_password
。
要么自己实现,要么(更好)通过继承django' s Member
创建AbrstactBaseUser
模型:
class MyUser(AbstractBaseUser):
username = models.CharField(max_length=16,primary_key=True)
password = models.CharField(max_length=16)
email = models.CharField(max_length=325)
security = models.CharField(max_length=16)
profile = models.OneToOneField(Profile, null=True)
following = models.ManyToManyField("self", symmetrical=False)
from_member_id = models.CharField(max_length=16)
USERNAME_FIELD = 'username'
您可以在django docs
中找到有关自定义用户模型的更多信息答案 3 :(得分:0)
不确定您是否这样做,但使用OneToOneField(用户)制作模型可能更容易,并为其提供其他字段。您只需要记住保存在新字段中或者字段在您呼叫时不会显示。
您在哪里设置user_form=Member(request.POST)
user = user_form.save()
user.set_password(user.password)
profile = user.userprofile
profile.bio = request.POST['bio']
profile.save()