前言:本文是学习网易微专业的《python全栈工程师 - Django快速建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!
一、课程目标
- 实现编辑和展示个人信息功能
- 将已学知识融会贯通
- 使用装饰器
二、详情解读
2.1.个人信息界面和功能
2.1.1.样式和功能
- 用户登录之后,点击用户名,在下拉菜单中进入“个人信息”
2.1.2.实现流程
- 创建模型类 – 数据库表
–User <---> auth_user
–UserProfile <--> account_userprofile
– 新建:UserInfo <--> account_userinfo
- 创建表单类
–UserForm
<-- 增加
–UserProfileForm
<-- 已有
–UserInfoForm
<-- 增加 - 读取个人信息
– 视图函数
– 模板
–URL
- 编辑个人信息
– 视图函数
– 模板
–URL
- 个人信息入口
实操一: 新建模型类和数据库表
Step1
:修改文件myproject/account/models.py
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
# 一对一关系
user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
phone = models.CharField(max_length=20, null=True)
def __str__(self):
return 'user {}'.format(self.user.username)
# 添加下面的模型
class UserInfo(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
company = models.CharField(max_length=100, blank=True)
profession = models.CharField(max_length=100, blank=True)
aboutme = models.TextField(blank=True)
def __str__(self):
return "user:{}".format(self.user.username)
说明:
1).OneToOneField()
使UserInfo
模型类的实例和User
模型类的实例产生一对一的关系。
2).on_delete=models.CASCADE
表示联级删除,即User
模型的实例被删除了,UserInfo
模型的实例也会被跟着被删除。
3).CharField()
字段一定要添加max_length
的参数,不然会报错。
4).blank=True
表示该字段可以为空。
Step2
:进行数据迁移。在控制台输入如下命令:
# 这里表示迁移 account
python3 manage.py makemigrations account
python3 manage.py migrate
然后到数据库查看,是否有数据表account_userinfo
实操二: 创建表单类
Step1
: 替换文件myproject/account/forms.py
为下面内容:
# -*- coding=utf-8 -*-
from django import forms
from django.contrib.auth.models import User
# 新增下面这一行引入 UserInfo 模型
from .models import UserProfile, UserInfo
class LoginForm(forms.Form):
"""
用户登录表单类
"""
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
# 注册表单的数据要入数据库,所以继承的是 ModelForm,
# 登录表单不需要入库,继承的是Form
class RegistrationForm(forms.ModelForm):
"""
用户注册表单类
"""
password = forms.CharField(widget=forms.PasswordInput)
password2 = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
# username和email跟模型类的表单字段是一样的,
# 所以不用重复定义,直接用下面的写法即可
fields = ('username', 'email')
def clean_password2(self):
cd = self.cleaned_data
if cd['password'] != cd['password2']:
raise forms.ValidationError('Password do not match.')
return cd['password2']
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ('phone',)
# 新增下面的User表单类和 UserInfo表单类
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ('email', )
class UserInfoForm(forms.ModelForm):
class Meta:
model = UserInfo
fields = ('company', 'profession', 'aboutme')
说明:
1).先在头部引入UserInfo
模型
2).新增UserForm
和UserInfoForm
表单类
实操三: 读取个人信息
Step1
:新建视图函数myself()
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from .forms import LoginForm, RegistrationForm, UserProfileForm
# 表示登录用户才有使用的视图函数
from django.contrib.auth.decorators import login_required
# 引入下面的模型
from .models import UserProfile, UserInfo
# from django.contrib.auth.models import User
def user_login(request):
if request.method == 'GET':
login_form = LoginForm()
return render(request, 'account/login.html', {
'form': login_form})
if request.method == 'POST':
login_form = LoginForm(request.POST)
if login_form.is_valid():
cd = login_form.cleaned_data
user = authenticate(username = cd['username'], password=cd