Django set_password没有属性

时间:2016-02-23 12:19:29

标签: python django sqlite

我试图使用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

4 个答案:

答案 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()