Django基础教程(五十)Django实现用户系统的注册功能:Django从入门到“脱单”:手把手教你搞定用户注册,告别单身(数据库)!

嘿,伙计们!是不是感觉自己的Django项目像个冷冷清清的“鬼城”,一个用户都没有?别担心,今天咱不聊高深的,就唠唠怎么给你的项目“拉人头”,实现最最基础,但又至关重要的功能——用户注册

这就像是给你空荡荡的数据库“介绍对象”,让新用户成功“落户”,从此你的网站不再是一座孤岛。放心,咱不整那些花里胡哨的,就用Django自带的“官方大礼包”——django.contrib.auth,它可比你想象的要强大和贴心!

第一幕:婚前准备——理解Django的“用户观”

在开始写代码前,咱们得先摸清Django是怎么看待一个“用户”的。这就好比结婚前得先了解对方的家庭情况和三观,对吧?

Django内置了一个超级强大的模型,叫 User,它就住在 django.contrib.auth.models 这个“高级小区”里。这个 User 对象,可以说是“德智体美劳”全面发展,自带了:

  • 用户名 username:唯一的身份ID,好比身份证号。
  • 密码 password:加密存储,非常安全,连管理员都看不到明文。
  • 邮箱 email:用于联系和找回密码。
  • 姓名 first_name, last_name:真实姓名。
  • 权限和组 groups, user_permissions:管理用户能看啥、能干啥,好比公司的职位和权限。

但是! 今天我要教你一个更高级、更常见的玩法——“自由恋爱”(自定义用户模型)

为啥?想象一下,万一你以后想用邮箱当用户名,或者想给用户加个“头像”、“手机号”这样的个性签名,原生的 User 模型就有点不够灵活了。所以,最佳实践是:项目一开始就创建一个自定义用户模型!

# 在 your_app/models.py 文件中
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    # 这里我们暂时不加新字段,但继承AbstractUser本身就已经是自定义了
    # 比如我们想加个手机号字段,将来可以这样扩展:
    # phone_number = models.CharField(max_length=15, blank=True)
    pass

看,我们创建了一个 CustomUser 模型,它继承了 AbstractUser。这就好比 CustomUserUser 的“富二代”,把老爸的所有家产(字段和方法)都继承了,而且自己还能随便添置新家当(字段)!

关键一步: 创建好后,你得告诉Django:“喂,以后别用你自带的那个 User 了,就用我自定义的这个!” 这个通知写在 settings.py 里:

# 在项目根目录的 settings.py 文件中
AUTH_USER_MODEL = 'your_app.CustomUser'
# 注意:'your_app' 要换成你实际创建的应用名!

这一步至关重要,相当于在民政局做了登记,以后Django系统内部就知道老大是谁了。

第二幕:牵线搭桥——打造注册的“信息收集表”(表单)

用户来注册,你得有个表格让人家填信息吧?在Django里,这个表格就叫 Form

难道我们要从零开始写一个表单,定义用户名、密码、密码确认这些字段吗?No, no, no! Django的Auth模块早就给你准备好了“标准表格”——UserCreationForm

不过,这个标准表格是给原生 User 模型用的,我们现在用的是自定义的 CustomUser。所以,我们需要对它进行一点点“改造”,让它为我们服务。

# 在 your_app/forms.py 文件中
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser # 从当前目录的models.py导入CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser # 指定这个表单是为我们的CustomUser服务的
        fields = ('username', 'email') # 指定表单里要显示哪些字段
        # 这里我们让用户填写 用户名 和 邮箱。密码字段UserCreationForm已经自动处理了。

看,就这么简单!UserCreationForm 已经自动帮我们处理了密码输入和密码确认的逻辑,我们只需要告诉它,你的“服务对象” modelCustomUser,并且你想在表单上展示哪些字段 fields 就行了。

第三幕:办理登记——处理注册业务的“办事窗口”(视图)

表格有了,总得有个“办事员”来接收表格、审核信息、最后把新用户的信息正式录入系统(存入数据库)吧?这个“办事员”就是Django里的 View(视图)

我们将使用基于类的视图 CreateView,因为它就是专门用来“创建”新对象的,和我们的注册功能是天作之合!

# 在 your_app/views.py 文件中
from django.urls import reverse_lazy
from django.views import generic
from .forms import CustomUserCreationForm # 导入我们刚刚自定义的表单

class SignUpView(generic.CreateView):
    form_class = CustomUserCreationForm # 指定使用哪个表单
    success_url = reverse_lazy('login') # 注册成功后,跳转到登录页面
    template_name = 'registration/signup.html' # 指定注册页面的模板文件位置

哇,是不是简单得令人发指?我们只用了三行核心代码,就完成了视图的所有逻辑:

  1. form_class:告诉视图,“喂,用这个表格去收集信息”。
  2. success_url:当用户成功提交信息并存入数据库后,要把他/她引导到哪里?这里我们设置成跳转到登录页面 ('login'),让用户去登录。reverse_lazy 是一种安全的URL反转方式。
  3. template_name:这个“办事窗口”长什么样?它的装修图纸(HTML模板)在哪里。

这个 CreateView 会自动帮你:

  • 显示空表单(GET请求)。
  • 接收用户提交的数据(POST请求)。
  • 验证数据是否有效(比如用户名是否重复,密码是否符合规则)。
  • 如果有效,自动调用 form.save() 将新用户存入数据库。
  • 最后跳转到 success_url
第四幕:装修门面——打造高颜值的“注册页面”(模板)

“办事窗口”不能光秃秃的啊,得有个漂亮的界面给用户看。这就是我们的HTML模板了。

首先,确保你在 settings.py 里设置了模板目录。然后,按照视图里 template_name 指定的路径,创建文件:templates/registration/signup.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>加入我们,开启奇妙之旅!</title>
    <!-- 引入Bootstrap让页面更美观 -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="d-flex justify-content-center align-items-center vh-100">
    <div class="card shadow" style="width: 24rem;">
        <div class="card-body">
            <h2 class="card-title text-center mb-4">用户注册</h2>
            
            <form method="post">
                <!-- 千万别忘了这行!防止CSRF攻击,相当于表单的“防伪码” -->
                {% csrf_token %}

                <!-- 自动渲染表单字段 -->
                {% for field in form %}
                <div class="mb-3">
                    <label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
                    {{ field }}
                    <!-- 显示字段的错误信息 -->
                    {% if field.errors %}
                    <div class="alert alert-danger mt-1">
                        {% for error in field.errors %}
                        <small>{{ error }}</small><br>
                        {% endfor %}
                    </div>
                    {% endif %}
                    <!-- 显示帮助文本 -->
                    {% if field.help_text %}
                    <div class="form-text">{{ field.help_text }}</div>
                    {% endif %}
                </div>
                {% endfor %}

                <button type="submit" class="btn btn-primary w-100">立即注册</button>
            </form>
            <hr>
            <p class="text-center">已有账号?<a href="{% url 'login' %}">直接登录</a></p>
        </div>
    </div>
</body>
</html>

这个模板做了几件事:

  • {% csrf_token %} 添加了安全令牌。
  • {% for field in form %} 循环遍历表单的每一个字段(用户名、邮箱、密码、密码确认),并自动生成对应的HTML标签。
  • 为每个字段添加了Bootstrap的样式类,让它变得好看。
  • 添加了错误信息显示 (field.errors) 和帮助文本显示 (field.help_text)。
  • 最后是一个提交按钮和跳转到登录页面的链接。
第五幕:广而告之——开通“注册通道”(配置URL)

“办事窗口”装修好了,位置也定了,但你得告诉用户怎么找到它啊!这就需要配置URL路由。

首先,在项目的根 urls.py 里,包含你应用的URLs:

# 项目根目录的 urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('your_app.urls')), # 包含你应用中的urls.py文件
    path('accounts/', include('django.contrib.auth.urls')), # 这是Django Auth自带的登录登出等URL,我们登录页用它
]

然后,在你自己的应用 your_app 下创建一个 urls.py 文件:

# your_app/urls.py
from django.urls import path
from .views import SignUpView

urlpatterns = [
    path('signup/', SignUpView.as_view(), name='signup'), # 注册页面
]

这样,当用户访问 /signup/ 这个地址时,Django就会调用我们写的 SignUpView 视图,展现出我们精心制作的注册页面。

最终大团圆:完整的“婚礼”流程与代码整合

好了,所有角色都已就位!让我们来捋一捋完整的流程和文件结构:

项目结构大概长这样:

my_project/
├── my_project/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py  # 项目的urls.py
│   └── wsgi.py
├── your_app/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py  # 我们创建的
│   ├── models.py # 我们创建的
│   ├── tests.py
│   ├── urls.py   # 我们创建的
│   └── views.py  # 我们创建的
└── templates/
    └── registration/
        └── signup.html # 我们创建的

操作步骤:

  1. 创建应用:python manage.py startapp your_app
  2. settings.pyINSTALLED_APPS 里注册 your_app
  3. settings.py 中设置 AUTH_USER_MODEL = 'your_app.CustomUser'
  4. 按照上面的代码,依次创建或修改 models.py, forms.py, views.py, your_app/urls.py, templates/registration/signup.html
  5. 生成并运行数据库迁移:
python manage.py makemigrations
python manage.py migrate
  1. 运行服务器:python manage.py runserver
  2. 打开浏览器,访问 http://127.0.0.1:8000/signup/,享受你的成果吧!
深度思考:我们不只是“码农”,更是“安全官”

当你看到注册成功,用户数据乖乖躺进数据库时,有没有想过Django在背后为你扛下了多少?

  • 密码加密:你存入数据库的密码,是一串类似 pbkdf2_sha256$... 的乱码,即使数据库泄露,黑客也很难反推出原始密码。
  • CSRF防护:模板里那个 {% csrf_token %} 有效地防止了跨站请求伪造攻击。
  • 表单验证UserCreationForm 自动帮你验证了用户名是否唯一、两次输入的密码是否一致、密码复杂度等。

所以,使用Django原生Auth系统,不仅是方便,更是一种安全的最佳实践。

总结一下,今天我们一起完成了Django用户注册的“一条龙服务”。从自定义用户模型这座“地基”,到打造表单和视图这两个“核心引擎”,再到装修模板“门面”,最后开通URL“网络通道”。每一步都充满了Django的哲学——DRY (Don‘t Repeat Yourself),尽可能少写代码,多做事情。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值