Python学习笔记:7.3.4 Django快速建站 - 个人信息

前言:本文是学习网易微专业的《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).新增UserFormUserInfoForm表单类

实操三: 读取个人信息

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值