Python 3.x Django PostgreSQL-密码为';t保存到数据库中
我有一个自定义用户模型和Python 3.x Django PostgreSQL-密码为';t保存到数据库中,python-3.x,django,postgresql,Python 3.x,Django,Postgresql,我有一个自定义用户模型和views.py中的一个函数来处理注册。例如,当我向Postman注册一个用户时,所有用户数据都正确地存储在数据库中,但密码字段仍然为空。我认为,当我尝试使用一个简单的登录页面时,这会导致问题——它从不接受我的凭据(因为数据库中没有密码)。你知道为什么不保存密码以及如何修复吗 注册新用户时,我在views.py中有这样一个函数: def register(response): if response.method == 'POST': form
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
编辑。这是我的注册表执行
:
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
类中的save函数。添加此选项解决了问题:
def save(self, commit=True):
user = super().save(commit=False)
user.set_password(self.cleaned_data["password"])
if commit:
user.save()
return user
共享您的用户模型。
RegisterForm
看起来像什么?@WillemVanOnsem我将模型编辑成我的问题。@markwalker\uu我将RegisterForm
编辑成我的问题。