我创建了一个自定义 UserModel 并使用电子邮件作为主要的身份验证 ID 而不是用户名。
它区分大小写的问题,因为它将 test@gmail.com,Test@gmail.com 计为 2 个不同的帐户。
我需要强制它处理 1 个帐户,而忽略它是大写还是小写。
这是我的文件:
模型.py
class UserModelManager(BaseUserManager):
def create_user(self, email, password, pseudo):
user = self.model()
user.name = name
user.email = self.normalize_email(email=email)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password):
'''
Used for: python manage.py createsuperuser
'''
user = self.model()
user.name = 'admin-yeah'
user.email = self.normalize_email(email=email)
user.set_password(password)
user.is_staff = True
user.is_superuser = True
user.save()
return user
class UserModel(AbstractBaseUser, PermissionsMixin):
## Personnal fields.
email = models.EmailField(max_length=254, unique=True)
name = models.CharField(max_length=16)
## [...]
## Django manage fields.
date_joined = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELD = ['email', 'name']
objects = UserModelManager()
def __str__(self):
return self.email
def get_short_name(self):
return self.name[:2].upper()
def get_full_name(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
views.py 中的注册视图
def signup(request):
if request.method == 'POST':
signup_form = SignUpForm(request.POST)
if signup_form.is_valid():
signup_form.save()
username = signup_form.cleaned_data.get('username')
raw_password = signup_form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
return redirect('signup_confirm')
else:
signup_form = SignUpForm()
context = {
'signup_form': signup_form,
}
return render(request, 'fostania_web_app/signup.html', context)
def signup_confirm(request):
return render(request, 'fostania_web_app/signup_confirm.html')
Run Code Online (Sandbox Code Playgroud)
forms.py 中的注册表单:
class SignUpForm(UserCreationForm):
email = forms.CharField(required=True, help_text='?????? ?????????? ????? ?? - ??? ?? ???? ????? (?????? ?????? ??????) ')
name = forms.CharField(required=True, help_text='???? ??????? - ????? ???? ??????')
password1 = forms.CharField(widget=forms.PasswordInput,
help_text='???? ?????? - ???? ?? ???? ???? ?????? ??????? ??')
password2 = forms.CharField(widget=forms.PasswordInput,
help_text='????? ???? ?????? - ???? ??? ???? ?????? ??????? ??? ????')
class Meta:
model = UserModel
fields = ('email','name', 'password1', 'password2', )
labels = {
'name': '???? ??????? - ????? ???? ??????',
'email': '?????? ?????????? Email',
'password1': '???? ??????',
'password2': '????? ???? ??????'
}
Run Code Online (Sandbox Code Playgroud)
我现在需要做的就是让它忽略大小写敏感。
更新
这是我的登录文件
网址.py
path('login/', auth_views.login, name='login'),
Run Code Online (Sandbox Code Playgroud)
注册/登录.html
<form method="post">
{% csrf_token %}
?????? ?????????? E-Mail <Br>{{ form.username }}
<br><br>
???? ?????? <Br>{{ form.password }}
<Br><br>
<div align="center">
<button class ="btn btn-primary" submit>????? ??????</button><br><br>
<a href="{% url 'signup' %}"><button type="button" class="btn btn-warning">
????? ???? ????</button></a>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
如果您不介意丢失用户输入电子邮件的格式,那么更简洁的方法可能是覆盖模型字段本身。
这对我来说效果更好,因为我只需要在一个地方更改它。否则,您可能需要担心注册、登录、用户更新、API 视图等。
这只会小写任何保存到UserModel.
from django.db import models
class LowercaseEmailField(models.EmailField):
"""
Override EmailField to convert emails to lowercase before saving.
"""
def to_python(self, value):
"""
Convert email to lowercase.
"""
value = super(LowercaseEmailField, self).to_python(value)
# Value can be None so check that it's a string before lowercasing.
if isinstance(value, str):
return value.lower()
return value
Run Code Online (Sandbox Code Playgroud)
您的用户模型将是..
# Assuming you saved the above in the same directory in a file called model_fields.py
from .model_fields import LowercaseEmailField
class UserModel(AbstractBaseUser, PermissionsMixin):
email = LowercaseEmailField(unique=True)
# other stuff...
Run Code Online (Sandbox Code Playgroud)
您不需要进行太多更改即可完成此操作 - 在您的情况下,您只需要更改表单并使用 Django 的内置表单数据清理器或创建自定义字段。
您应该使用EmailField代替 aCharField进行内置验证。此外,您没有发布您的 AuthenticationForm,但我认为您已将其更改为 includeemail而不是username.
使用数据清理器:
class SignUpForm(UserCreationForm):
# your code
email = forms.EmailField(required=True)
def clean_email(self):
data = self.cleaned_data['email']
return data.lower()
class AuthenticationForm(forms.Form):
# your code
email = forms.EmailField(required=True)
def clean_email(self):
data = self.cleaned_data['email']
return data.lower()
Run Code Online (Sandbox Code Playgroud)
使用自定义字段:
class EmailLowerField(forms.EmailField):
def to_python(self, value):
return value.lower()
class SignUpForm(UserCreationForm):
# your code
email = EmailLowerField(required=True)
class AuthenticationForm(forms.Form):
# your code
email = EmailLowerField(required=True)
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以确保每封电子邮件都以小写形式保存到您的数据库中,并且对于每次登录尝试,电子邮件在与数据库值进行比较之前都是小写的。
| 归档时间: |
|
| 查看次数: |
5225 次 |
| 最近记录: |