【问题标题】:Django PostgreSQL - the password isn't saved to the databaseDjango PostgreSQL - 密码未保存到数据库中
【发布时间】:2021-08-12 19:46:00
【问题描述】:

我在views.py 中有一个自定义用户模型和一个函数来处理注册。例如,当我向 Postman 注册用户时,所有用户数据都正确存储在数据库中,但密码字段仍然为空。我认为当我尝试使用简单的登录页面时会导致问题 - 它从不接受我的凭据(因为数据库中没有密码)。任何想法为什么没有保存密码以及如何修复它?

我在views.py注册新用户时有这样的功能:

def register(response):

    if response.method == 'POST':

        form = RegisterForm(response.POST)

        if form.is_valid():

            user = form.save()

            user.refresh_from_db()

            user.id = form.cleaned_data.get('id')

            user.save()

            username = form.cleaned_data.get('email')

            password = form.cleaned_data.get('password')

            user = authenticate(username=email, password=password)    
    
            return HttpResponse(status=201)



        else:

            form = RegisterForm()

    
    return HttpResponse(status=400)

这是我的自定义用户模型:

class UserManager(BaseUserManager):

    def create_user(self, email, password):

        """

        Creates and saves a User with the given email and password.

        """

        if not email:

            raise ValueError('A user must have a email.')



        user = self.model(

            email=self.normalize_email(email),

        )



        user.set_password(password)

        user.save(using=self._db)

        return user

编辑。这是我的RegisterForm

User = get_user_model()

class RegisterForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)
    password_2 = forms.CharField(label='Confirm Password', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['email', 'id', 'gender', 'height', 'weight']

    def clean_email(self):
        '''
        Verify email is available.
        '''
        email = self.cleaned_data.get('email')
        qs = User.objects.filter(email=email)
        if qs.exists():
            raise forms.ValidationError("email is taken")
        return email 
    
    def clean_id(self):
        '''
        Verify id is available.
        '''
        id = self.cleaned_data.get('id')
        qs = User.objects.filter(id=id)
        if qs.exists():
            raise forms.ValidationError("id is taken")
        return id

    def clean(self):
        '''
        Verify both passwords match.
        '''
        cleaned_data = super().clean()
        password = cleaned_data.get("password")
        password_2 = cleaned_data.get("password_2")
        if password is not None and password != password_2:
            self.add_error("password_2", "Your passwords must match")
        return cleaned_data

这是模型:

class CustomUser(AbstractBaseUser):

    is_active = models.BooleanField(default=True)

    staff = models.BooleanField(default=False) # a admin user; non super-user

    admin = models.BooleanField(default=False) # a superuser

    gender = models.CharField(null=True, blank=True, max_length=20)

    height = models.CharField(null=True, blank=True, max_length=3)

    id = models.CharField(primary_key=True, unique=True, blank=False, max_length=100)

    email= models.EmailField(max_length=100, unique=True, null=False, blank=False)

    weight = models.CharField(max_length=3, null=True, blank=True)    


    USERNAME_FIELD = 'email'

    REQUIRED_FIELDS = [] # Email & Password are required by default.



    def get_full_name(self):

        # The user is identified by their email address

        return self.email



    def get_short_name(self):

        # The user is identified by their email address

        return self.email



    def __str__(self):

        return self.email



    def has_perm(self, perm, obj=None):

        "Does the user have a specific permission?"

        # Simplest possible answer: Yes, always

        return True



    def has_module_perms(self, app_label):

        "Does the user have permissions to view the app `app_label`?"

        # Simplest possible answer: Yes, always

        return True



    @property

    def is_staff(self):

        "Is the user a member of staff?"

        return self.staff



    @property

    def is_admin(self):

        "Is the user a admin member?"

        return self.admin



    objects = UserManager()

【问题讨论】:

  • 分享你的用户模型。
  • RegisterForm 长什么样子?
  • @WillemVanOnsem 我将模型编辑到我的问题中。
  • @markwalker_ 我将RegisterForm 编辑到我的问题中。

标签: python-3.x django postgresql


【解决方案1】:

在编辑我的问题后不久,我注意到我缺少 RegisterForm 类的保存功能。添加这个解决了问题:

def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 2016-05-29
    • 2021-08-13
    • 2020-07-11
    • 1970-01-01
    • 2021-10-07
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多