项目整体结构
student_system/ # 项目根目录
├── accounts/ # 处理用户账号的应用
│ ├── templates/ # 存放HTML模板
│ │ ├── accounts/ # 登录注册相关模板
│ │ │ ├── login.html # 登录页面
│ │ │ └── register.html # 注册页面
│ │ └── home.html # 首页
│ ├── __init__.py
│ ├── admin.py # 管理员配置
│ ├── apps.py # 应用配置
│ ├── forms.py # 表单定义
│ ├── models.py # 数据模型
│ ├── tests.py # 测试文件
│ ├── urls.py # 应用路由配置
│ └── views.py # 视图函数
├── student_system/ # 项目核心配置
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py # 项目设置
│ ├── urls.py # 主路由配置
│ └── wsgi.py
└── manage.py # Django命令行工具
实现步骤详解
1. 环境准备与项目创建
首先确保你已经安装了 Django(如果没有安装,使用pip install django命令)。然后通过以下命令创建项目和应用:
# 创建项目
django-admin startproject student_system
# 进入项目目录
cd student_system
# 创建处理用户账号的应用
python manage.py startapp accounts
2. 配置项目设置(settings.py)
打开student_system/settings.py文件,我们需要做这些配置:
-
在
INSTALLED_APPS中添加我们创建的accounts应用 -
配置登录和注销后的跳转页面
-
设置语言为中文(方便显示)
应用注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
# ... 其他默认应用
'accounts', # 添加我们的应用
]登录/注销后跳转页面配置
LOGIN_REDIRECT_URL = '/' # 登录后跳转到首页
LOGOUT_REDIRECT_URL = '/login/' # 注销后跳转到登录页语言设置为简体中文
LANGUAGE_CODE = 'zh-hans'
3. 创建用户注册表单(forms.py)
在accounts目录下创建forms.py文件,用于定义注册表单。我们扩展 Django 自带的用户创建表单,增加邮箱字段:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class RegisterForm(UserCreationForm):
# 增加邮箱字段,设为必填
email = forms.EmailField(required=True)
class Meta:
model = User # 使用Django内置的User模型
# 注册时需要填写的字段
fields = ['username', 'email', 'password1', 'password2']
# 保存用户信息,特别是邮箱(Django默认不保存邮箱)
def save(self, commit=True):
user = super().save(commit=False) # 先不保存到数据库
user.email = self.cleaned_data['email'] # 获取表单中的邮箱
if commit:
user.save() # 保存用户信息到数据库
return user
4. 实现视图函数(views.py)
视图函数用于处理用户的请求,我们在accounts/views.py中实现注册功能:
from django.shortcuts import render, redirect
from django.contrib.auth import login # 用于登录用户
from .forms import RegisterForm # 导入我们创建的注册表单
def register(request):
# 如果是POST请求(用户提交表单)
if request.method == 'POST':
form = RegisterForm(request.POST) # 获取表单数据
if form.is_valid(): # 验证表单数据是否有效
user = form.save() # 保存用户到数据库
login(request, user) # 注册后自动登录
return redirect('home') # 跳转到首页
else:
# 如果是GET请求,显示空表单
form = RegisterForm()
# 渲染注册页面,传递表单数据
return render(request, 'accounts/register.html', {'form': form})
5. 创建模板文件
模板文件就是用户看到的网页,我们需要创建三个关键模板:
注册页面(register.html)
在accounts/templates/accounts/目录下创建register.html:
<!DOCTYPE html>
<html>
<head>
<title>注册</title>
</head>
<body>
<h2>注册</h2>
<form method="post">
{% csrf_token %} <!-- 安全机制,必须添加 -->
<!-- 显示表单字段,as_p表示每个字段用<p>标签包裹 -->
{{ form.as_p }}
<button type="submit">注册</button>
</form>
<!-- 显示错误信息(如果有) -->
{% if form.errors %}
<div style="color: red;">
{% for field in form %}
{% for error in field.errors %}
{{ field.label }}: {{ error }}
{% endfor %}
{% endfor %}
</div>
{% endif %}
</body>
</html>
登录页面(login.html)
同样在accounts/templates/accounts/目录下创建login.html:
<!DOCTYPE html>
<html>
<head>
<title>登录</title>
</head>
<body>
<h2>登录</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }} <!-- 显示登录表单 -->
<button type="submit">登录</button>
</form>
<!-- 显示错误信息 -->
{% if form.username.errors %}
<p style="color: red;">{{ form.username.errors.0 }}</p>
{% endif %}
<!-- 注册链接 -->
<p>还没有账号?<a href="{% url 'register' %}">注册</a></p>
</body>
</html>
首页(home.html)
在accounts/templates/目录下创建home.html,用于显示用户登录后的页面:
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
</head>
<body>
{% if user.is_authenticated %} <!-- 判断用户是否已登录 -->
<h1>欢迎,{{ user.username }}!</h1> <!-- 显示用户名 -->
<p>邮箱:{{ user.email }}</p> <!-- 显示邮箱 -->
<!-- 登出表单 -->
<form action="{% url 'logout' %}" method="post" style="display: inline;">
{% csrf_token %}
<button type="submit">退出登录</button>
</form>
{% else %} <!-- 未登录状态 -->
<h1>请先登录</h1>
<a href="{% url 'login' %}">登录</a>
<a href="{% url 'register' %}">注册</a>
{% endif %}
</body>
</html>
6. 配置 URL 路由
路由用于将 URL 地址映射到对应的视图函数,我们需要配置两处路由:
应用路由(accounts/urls.py)
创建accounts/urls.py文件,定义登录、注册、注销的路由:
from django.urls import path
from django.contrib.auth import views as auth_views # 导入Django内置的认证视图
from . import views # 导入我们的视图
urlpatterns = [
# 注册路由,对应views.register函数
path('register/', views.register, name='register'),
# 登录路由,使用Django内置的LoginView,指定模板
path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='login'),
# 注销路由,使用Django内置的LogoutView,指定注销后跳转页面
path('logout/', auth_views.LogoutView.as_view(next_page='/login/'), name='logout'),
]
主项目路由(student_system/urls.py)
修改项目根目录的urls.py,将 accounts 应用的路由包含进来:
from django.contrib import admin
from django.urls import path, include
from django.views.generic import TemplateView # 用于显示首页
urlpatterns = [
path('admin/', admin.site.urls),
# 包含accounts应用的路由
path('', include('accounts.urls')),
# 首页路由,使用TemplateView直接显示模板
path('', TemplateView.as_view(template_name='home.html'), name='home'),
]
7. 数据库迁移
Django 使用 ORM 管理数据库,我们需要执行迁移命令来创建用户相关的数据表:
# 生成迁移文件
python manage.py makemigrations
# 执行迁移,创建数据表
python manage.py migrate
8. 运行项目并测试
一切准备就绪,运行开发服务器:
python manage.py runserver
在浏览器中访问以下地址进行测试:
在浏览器中访问以下地址进行测试:
功能流程总结
-
注册流程:
- 用户访问注册页面填写信息
- 表单验证通过后,保存用户信息到数据库
- 自动登录用户并跳转到首页
-
登录流程:
- 用户访问登录页面输入账号密码
- 验证通过后跳转到首页
- 首页显示用户信息和退出登录按钮
-
注销流程:
- 已登录用户点击退出登录按钮
- 系统清除登录状态,跳转到登录页面
通过这个项目,我们学习了如何使用 Django 的内置用户系统快速实现登录注册功能,包括表单处理、视图逻辑、模板渲染和 URL 配置等关键知识点。对于小白来说,理解这些基础流程后,可以尝试扩展更多功能,如密码重置、个人信息修改等。
效果图
创建超级管理员账号
python manage.py createsuperuser

未登录home页

登录页面

注册页面

登录后的home页面

注册的用户在管理后台查看


