删除 Django 登录表单中电子邮件的区分大小写

2023-11-26

我创建了一个自定义 UserModel 并使用电子邮件作为主要身份验证 ID 而不是用户名。

问题是大小写敏感,因为它很重要[电子邮件受保护],[电子邮件受保护]作为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

注册查看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')

注册表单在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': 'تأكيد كلمة المرور'
        }

我现在需要的只是让它忽略大小写。

update

这是我的登录文件

urls.py

   path('login/', auth_views.login, name='login'),

注册/login.html

    <form method="post">
    {% csrf_token %}
    البريد الإلكترونى E-Mail &nbsp;<Br>{{ form.username }}
                    <br><br>
                     كلمة المرور &nbsp;<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>

如果您不介意丢失用户输入电子邮件的格式,则更简洁的方法可能是覆盖模型字段本身。

这对我来说效果更好,因为我只需在一处进行更改。否则,您可能需要担心注册、登录、用户更新、API 视图等。

您必须覆盖的唯一方法是to_python。这只会将保存到的任何内容小写UserModel.email field.

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

那么你的用户模型就会是..


# 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...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除 Django 登录表单中电子邮件的区分大小写 的相关文章

随机推荐

  • 在 ggplot x 轴上显示所有日期值 - R

    在下面的小数据集中 我想在 x 轴上绘制日期值 我希望标记数据框中存在的所有日期刻度 目前它只标记 3 个随机刻度 我可以将该列更改为一个因子 但将其作为日期意味着 x 轴根据点之间的时间间隔进行间隔 到目前为止 我能找到的唯一答案是想要每
  • Python正则表达式匹配字符串末尾的标点符号

    我需要在Python中匹配一个句子是否以大写开头并以 结尾 EDIT它必须有 only at end 但允许在句子中使用其他标点符号 import re s This sentence is correct This sentence is
  • python 有 soundex 函数吗?

    python 是否有 soundex 函数 如果没有 你将如何编写 soundex 代码 Soundex Code Letters 1 B F P V 2 C G J K Q S X Z 3 D T 4 L 5 M N 6 R SKIP A
  • Objective C - 静态和全局变量?

    在名为 Ad 的类的 m 文件中 我有 3 个静态字符串 static NSString AdStateDisabled disable static NSString AdStateExpired expired static NSStr
  • 构建oozie:未知主机repository.codehaus.org

    我正在尝试构建从此处下载的 Oozie 4 2 0 http ftp cixug es apache oozie 4 2 0 oozie 4 2 0 tar gz 启动构建后 bin mkdistro sh DskipTests 我收到此错
  • 适用于作业服务器的 Amazon Auto Scaling API

    我已经阅读了几乎整个文档 甚至超出了 AWS AS API 的范围 以了解所有 AS 内容 然而 我仍然想知道 尚未实际使用 API 因为我想先从某人那里找到这一点 我的场景是否适用于 AS 假设我在一个 AS 组内设置了一堆工作服务器 每
  • 如何抑制 Python 日志记录模块中的换行符。 [复制]

    这个问题在这里已经有答案了 我想在执行 log info msg 操作时取消换行符 当我们 打印 它时 print msg 所以我需要像 coma 这样的东西来记录 我播下这个问题在 Python 日志记录模块中禁止换行但有人可以给我参考或
  • 使用 React 从 Babel 迁移到 SWC

    TL DR 如何翻译这样的节点脚本 test NODE ENV test riteway r babel register src test js tap nirvana to use SWC而不是巴别塔 Context 我们最近升级了 N
  • 如何检查另一个窗口中是否有打开的 URL?

    这是我上一个问题的后续如果窗口尚不存在 则打开一个窗口本质上 我现在保留一个页面已打开的所有窗口引用的列表 并且仅允许它们尚未打开时打开 然后一个潜在的问题引起了我的注意 用户当然有可能关闭原始窗口 然后再次打开它 从而丢失窗口引用列表 是
  • Qt5.6:高DPI支持和OpenGL(OpenSceneGraph)

    我有一个最小的应用程序 它使用QOpenGLWidget集成了 OpenGL 包装库 OpenSceneGraph 我试图弄清楚在处理我使用的 OpenGL 内容时如何正确使用 Qt5 6 对高 DPI 屏幕的支持 My main 函数有以
  • Vite + ESBuild错误:没有为“.node”文件配置加载器:node_modules/fsevents/fsevents.node

    我对 ReactJS 和 Vite 很陌生 我正在编写一些教程 突然开始出现以下错误 我尝试重新安装node modules但没有成功 错误 没有为 node 文件配置加载程序 node modules fsevents fsevents
  • Spring @Transactional 注释不能与自动装配一起使用?

    我的应用程序使用 Spring 自动装配来配置 bean 我刚刚尝试添加 Transactional 预期的代理似乎没有被调用 我希望 PersonalController 使用事务代理包装的 UpdatePublicMapService
  • 从 dotnet Core 2.2.6 更改为 3.0.0 后出现 EF Linq 错误

    我正在尝试将解决方案升级到新的 Core Framework 3 0 0 现在我有一个小问题我不明白 看一下 这个方法在2 2 6中是没有问题的 public async Task
  • Gulp 错误:观看 ENOSPC

    您好 我在运行 gulp watch 时收到此错误 我在用着vueify在 Laravel 项目中 为什么会发生这种情况 这几天一直运行良好 今天就到了 gulp watch 12 56 01 Using gulpfile Document
  • 成功的特定领域语言?您使用哪一款? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我对领域特定语言的设计和实
  • 在 EAP 6.4.0 中使用 JPA 2.1

    我寻找这个问题的解决方案 到目前为止还没有成功 我们正在将应用程序迁移到 EAP 6 4 0 并且我们的应用程序依赖于 JPA 2 1 然而 JBoss 是一个 Java EE 6 服务器 因此以模块的形式包含 JPA 2 0 我尝试将 J
  • 如何使用 JavaScript 导航到不同的页面

    我目前正在使用以下代码将用户重定向到 C 中的另一个页面 Response Redirect somepage aspx 不过 我想用 JavaScript 来完成此操作 试试下面的代码
  • 如何从SQLite数据库中获取特定月份的数据

    我将数据保存在 SQLite 数据库中 我将日期保存在数据库中作为 DATETIME 数据类型 我只想从 SQLite 数据库中检索特定月份的数据 我尝试使用以下查询来检索数据 但它没有用 它为我提供了数据 但不是特定月份 SELECT c
  • 如何在集群中运行的节点中选举主节点?

    我正在编写一个托管云堆栈 在 EC2 等硬件级云提供商之上 我很快将面临的一个问题是 几个相同的节点如何决定其中哪一个成为主节点 即考虑在 EC2 上运行 5 台服务器 其中一台必须成为主服务器 其他服务器必须成为从服务器 我读到了一个描述
  • 删除 Django 登录表单中电子邮件的区分大小写

    我创建了一个自定义 UserModel 并使用电子邮件作为主要身份验证 ID 而不是用户名 问题是大小写敏感 因为它很重要 电子邮件受保护 电子邮件受保护 作为2个不同的帐户 我需要强制它作为 1 个帐户来处理 忽略它是大写还是小写 这是我