嘿,伙计们!是不是感觉自己的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。这就好比 CustomUser 是 User 的“富二代”,把老爸的所有家产(字段和方法)都继承了,而且自己还能随便添置新家当(字段)!
关键一步: 创建好后,你得告诉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 已经自动帮我们处理了密码输入和密码确认的逻辑,我们只需要告诉它,你的“服务对象” model 是 CustomUser,并且你想在表单上展示哪些字段 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' # 指定注册页面的模板文件位置
哇,是不是简单得令人发指?我们只用了三行核心代码,就完成了视图的所有逻辑:
form_class:告诉视图,“喂,用这个表格去收集信息”。success_url:当用户成功提交信息并存入数据库后,要把他/她引导到哪里?这里我们设置成跳转到登录页面 ('login'),让用户去登录。reverse_lazy是一种安全的URL反转方式。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 # 我们创建的
操作步骤:
- 创建应用:
python manage.py startapp your_app - 在
settings.py的INSTALLED_APPS里注册your_app。 - 在
settings.py中设置AUTH_USER_MODEL = 'your_app.CustomUser'。 - 按照上面的代码,依次创建或修改
models.py,forms.py,views.py,your_app/urls.py,templates/registration/signup.html。 - 生成并运行数据库迁移:
python manage.py makemigrations
python manage.py migrate
- 运行服务器:
python manage.py runserver - 打开浏览器,访问
http://127.0.0.1:8000/signup/,享受你的成果吧!
深度思考:我们不只是“码农”,更是“安全官”
当你看到注册成功,用户数据乖乖躺进数据库时,有没有想过Django在背后为你扛下了多少?
- 密码加密:你存入数据库的密码,是一串类似
pbkdf2_sha256$...的乱码,即使数据库泄露,黑客也很难反推出原始密码。 - CSRF防护:模板里那个
{% csrf_token %}有效地防止了跨站请求伪造攻击。 - 表单验证:
UserCreationForm自动帮你验证了用户名是否唯一、两次输入的密码是否一致、密码复杂度等。
所以,使用Django原生Auth系统,不仅是方便,更是一种安全的最佳实践。
总结一下,今天我们一起完成了Django用户注册的“一条龙服务”。从自定义用户模型这座“地基”,到打造表单和视图这两个“核心引擎”,再到装修模板“门面”,最后开通URL“网络通道”。每一步都充满了Django的哲学——DRY (Don‘t Repeat Yourself),尽可能少写代码,多做事情。
886

被折叠的 条评论
为什么被折叠?



