Django 内置 User 模型(django.contrib.auth.models.User),它继承自 AbstractUser 类。User 模型包含的字段有:
- username
- password
- first_name
- last_name
- is_active
- is_staff
- is_superuser
- date_joined
其中,username 和 password 是必需的,其他字段是可选的。
创建应用
在 mysite 项目中新建一个应用 users:
$ python manage.py startapp users
模型设计
如果我们想存储与 User 模型关联的信息,可以使用 OneToOneField 到包含其他信息字段的模型。这种模型经常被称作 Profile 模型,因为它可能存储站点用户的非身份验证的相关信息。编辑 users/models.py 文件:
from django.db import modelsfrom django.contrib.auth.models import Userclass UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) phone = models.CharField(max_length=20, blank=True) def __str__(self): return self.phone class Meta: verbose_name = '用户' verbose_name_plural = '用户'
数据库设置
数据库我们选择系统默认的 Sqlite,不用修改 mysite/settings.py 配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}
然后在终端输入以下命令,来创建 UserProfile 的数据表。
$ python manage.py makemigrations $ python manage.py migrate
注册APP
在 mysite/settings.py 配置项 INSTALLED_APPS 中添加应用:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'users.apps.UsersConfig', ]
表单
让用户通过表单提交数据,并处理这些数据。我们新建一个 users/forms.py 文件,然后创建 form 。代码如下:
from django import formsfrom django.contrib.auth.models import User class LoginForm(forms.Form): username = forms.CharField(label='用户名', max_length=30) password = forms.CharField(label='密码', widget=forms.PasswordInput)
1. 注册视图
1 from django.shortcuts import render, redirect 2 from django.contrib import auth 3 from django.contrib.auth.forms import UserCreationForm 4 from django.contrib.auth.models import User 5 from users.models import UserProfile 6 7 def register(request): 8 if request.method == "POST": 9 register_form = UserCreationForm(request.POST) # UserCreationForm 创建用户表单10 if register_form.is_valid():11 username = register_form.cleaned_data['username']12 password = register_form.cleaned_data['password1']13 password_confirm = register_form.cleaned_data['password2']14 user_name = User.objects.filter(username=username)15 if len(user_name) == 0:16 if password == password_confirm:17 user = User.objects.create_user(username=username, password=password)18 UserProfile.objects.create(user_id=user.id)19 auth.login(request, user)20 return redirect('/users/login/')21 else:22 return render(request, 'users/register.html', locals())23 else:24 register_form = UserCreationForm()25 return render(request, 'users/register.html', { 'register_form': register_form})
2. 登录视图
1 from django.shortcuts import render, redirect 2 from django.contrib import auth, messages 3 from users.forms import LoginForm 4 from django.contrib.auth.models import User 5 6 def login(request): 7 if request.method == "POST": 8 login_form = LoginForm(request.POST) 9 if login_form.is_valid():10 username = login_form.cleaned_data['username']11 password = login_form.cleaned_data['password']12 user = auth.authenticate(username=username, password=password) # 后端验证用户名和密码13 if user and user.is_active:14 auth.login(request, user) # 将用户数据保存在 session 中,即实现了登录动作15 messages.success(request, '登录成功')16 return redirect('/users/index/')17 else:18 messages.error(request, '用户名或密码错误')19 return render(request, 'users/login.html', locals())20 else:21 login_form = LoginForm()22 return render(request, 'users/login.html', { 'login_form': login_form})
3. index 和 logout 视图
def logout(request): auth.logout(request) # 调用 logout() 后,当前请求的会话数据会被全部清除 return redirect('/users/login/')def index(request): return render(request, 'users/index.html')
URL路由
from django.urls import pathfrom . import viewsapp_name = 'users'urlpatterns = [ path('index/', views.index, name='index'), path('login/', views.login, name='login'), path('register/', views.register, name='register'), path('logout/', views.logout, name='logout'),]