Vue全栈开发旅游网项目(10)-设计用户模型

1.设计用户模型

文件地址:accounts/models.py

1.1 用户详细信息

内容包括:性别 手机号 年龄 生日 真实姓名

创建常量:1-男,0-女;editable=False不许循环

class Profile(models.Model):SEX_CHOICES={(1,'男'),(0,'女')}username = models.CharField('用户名',max_length=64, unique=True,editable=False)user = models.OneToOneField(User,related_name="profile",on_delete=models.CASCADE)real_name = models.CharField('真实姓名',max_length=32)email = models.CharField('电子邮件',max_length=128,null=True,blank=True)is_email_valid = models.BooleanField('电子邮件是否已经被验证',default=False)phone_no = models.CharField('手机号码',max_length=20,null=True,blank=True)is_phone_valid = models.BooleanField('电话号码是否已经被验证', default=False)sex = models.SmallIntegerField('性别',default=1,choices=SEX_CHOICES)age = models.SmallIntegerField('年龄', default=0)source = models.CharField('登录的来源',max_length=16,null=True)version = models.CharField('登录的版本',max_length=32,null=True)created_at = models.DateTimeField('登录时间',auto_now_add=True)updated_at = models.DateTimeField('修改时间',auto_now=True)class Meta:db_table = "accounts_user_profile"

1.2  用户登录日志

class LoginRecord(models.Model):user = models.ForeignKey(User,related_name='login_records',on_delete=models.CASCADE)username = models.CharField('登录的账号',max_length=64)ip = models.CharField('IP',max_length=32)address = models.CharField('地址',max_length=32,null=True,blank=True)source = models.CharField('登录的来源',max_length=16,null=True)version = models.CharField('登录的版本', max_length=16, null=True)created_at = models.DateTimeField('登录的时间',auto_now_add=True)class Meta:db_table = "accounts_login_record"

2.数据迁移

python manage.py check

python manage.py makemigrations

python manage.py migrate 

3.准备Django模板

3.1 创建用户模板文件

3.2 用户登录

文件地址:accounts/templates/user_login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户登录</title>
</head>
<body><h3>用户登录</h3><form method="post" action="."><div><!--用户名-->{{ form.username.label }}<!--用户名文字提示-->{{ form.username }}<!--用户名文本-->{{ form.username.errors.as_text }}<!--用户名错误--></div><div><!--密码-->{{ form.password.label }}<!--密码文字提示-->{{ form.password }}<!--密码文本-->{{ form.password.errors.as_text }}<!--密码错误--></div><div>{{ form.non_field_errors.as_text }} <!--验证错误提示--></div><input type="submit" value="登录"></form>
</body>
</html>

3.3 用户基本信息

文件地址:accounts/templates/user_info.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户的基本信息</title>
</head>
<body><p>当前登录的用户是:{{ user.username }}-{{ user.email }}</p>{% if user.is_authenticated %}<a href="/accounts/user/logout">退出登录</a>{% endif %}
</body>
</html>

3.4 配置setting

import os
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware',👈把它删咯'django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR / 'templates')],👈加上os.path.join'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]

4.表单验证

新建文件:accounts/forms.py

继承父类 重写子类

import re
from django import forms
from django.contrib.auth import authenticate, login
from django.utils.timezone import nowclass LoginForm(forms.Form):# 登录表单username = forms.CharField(label='用户名',max_length=100,required=False,help_text='使用帮助',initial='admin')password = forms.CharField(label='密码',max_length=200,min_length=6,widget=forms.PasswordInput)#初始化函数,将传入的数据给到父类中处理def __init__(self,*args,**kwargs):super().__init__(*args,**kwargs)self.user = None#验证用户名的钩子函数def clean_username(self):username = self.cleaned_data['username']pattern = r'^1[0-9]{10}$'if not re.search(pattern,username):raise forms.ValidationError('手机号%s输入不正确',code='invalid_phone',params=(username,))return username#用户名密码验证def clean(self):data = super().clean()if self.errors:return#获取模板中输入的用户名密码username = data.get('username',None)password = data.get('password',None)#验证用户名密码是否正确user = authenticate(username=username,password=password)if user is None:raise forms.ValidationError('用户名或密码不正确')else:if not user.is_active:raise forms.ValidationError('该用户已经被禁用')self.user = userreturn data#登陆函数def do_login(self,request):user = self.user#调用登录login(request, user)#修改登陆时间user.last_login = now()user.save()return user

5.用户登录视图函数

from django.contrib.auth import logout
from django.shortcuts import render, redirect
from accounts.forms import LoginForm
def user_login(request):#用户登录if request.method == 'POST':form = LoginForm(data=request.POST)if form.is_valid():form.do_login(request)print('表单验证通过')return redirect('/accounts/user/info/')else:print(form.errors)else:form = LoginForm()return render(request,'user_login.html',{'form':form})def user_info(request):#用户信息print(request.user)return render(request, 'user_info.html')def user_logout(request):#退出登录logout(request)return redirect('/accounts/user/info/')

6.配置路由

新建文件:accounts/urls.py

from django.urls import path
from accounts import viewsurlpatterns = [#用户登录path('user/login/',views.user_login,name='user_login'),#用户详细信息path('user/info/',views.user_info,name='user_info'),#用户退出登录path('user/logout/',views.user_logout,name='user_logout')
]

全局urls:

7.登录结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch实战应用:从入门到精通

在当今这个数据爆炸的时代&#xff0c;如何快速、有效地从海量数据中检索信息&#xff0c;已经成为了许多企业和开发者面临的挑战。Elasticsearch&#xff0c;作为一个基于Lucene的搜索引擎&#xff0c;以其强大的全文搜索能力、分布式特性以及易用性&#xff0c;成为了解决这一…

15分钟学 Go 第 44 天: 项目部署基础

第44天&#xff1a;项目部署基础 学习目标 在这一课中&#xff0c;我们将学习如何部署Go应用程序。重点包括&#xff1a; Go应用的构建与打包选择合适的部署环境使用Docker容器化Go应用云平台部署基础常见问题与调试方法 1. Go应用的构建与打包 1.1 构建应用 在部署之前&a…

鸿蒙next版开发:ArkTS组件点击事件详解

在HarmonyOS 5.0中&#xff0c;ArkTS提供了一套完整的组件和事件处理机制&#xff0c;使得开发者能够创建交互性强的应用程序。本文将详细解读如何使用ArkTS组件处理点击事件&#xff0c;包括事件的注册、回调函数的编写以及事件对象的使用。 点击事件基础 点击事件是用户与应…

Kafka参数了解

Kafka配置参数完整说明 1. 基础配置 参数名说明推荐值参考值broker.idbroker的唯一标识符每个节点唯一的整数1delete.topic.enable是否允许删除topictruetruelistenersbroker监听地址SASL_PLAINTEXT://host:9092SASL_PLAINTEXT://172.24.77.15:9092advertised.listeners对外发…

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器&#xff0c;就像数组一样&#xff0c;vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效&#xff0c;但是它的大小是动态可变的&#xff0c;并且它的大小会被容器自动处理。 二、vector的构造 常用的构…

迁徙线,动态轨迹线

使用canvas结合贝塞尔曲线实现&#xff0c;效果如下 <template><div class"box"><div class"mapBox"><div class"map"><img src"/img/dataCockpit/map.png" alt"" /><div class"dot&…

SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-39/ 本关是堆…

STL常用遍历算法

概述: 算法主要是由头文件<algorithm> <functional> <numeric>组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric>体积很小&#xff0c;只包括几个在序列上面进行简…

【LeetCode】【算法】21. 合并两个有序链表

LeetCode 21. 合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路 用归并排序的做法就可以 代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* …

NVM 介绍及使用指南

在日常的开发工作中&#xff0c;我们往往会遇到需要在同一台机器上同时管理多个版本的 Node.js 的情况。为了解决这个问题&#xff0c;我一个同事推荐了NVM&#xff08;Node Version Manager&#xff09;。NVM 是一个用于管理 Node.js 版本的工具&#xff0c;可以方便地在不同的…

Suffix Tree (后缀树)、Suffix Array (后缀数组)、LZW树详细解读

一、后缀树&#xff08;Suffix Tree&#xff09; 1. 定义 后缀树是一种紧凑的前缀树&#xff08;前缀树的特殊形式&#xff09;&#xff0c;用于表示字符串的所有后缀。它是一种能够快速完成字符串模式匹配的数据结构&#xff0c;适合解决子串搜索和模式匹配等问题。 2. 工作…

web——[SUCTF 2019]EasySQL1——堆叠注入

这个题主要是讲述了堆叠注入的用法&#xff0c;来复现一下 什么是堆叠注入 堆叠注入&#xff1a;将多条SQL语句放在一起&#xff0c;并用分号;隔开。 1.查看数据库的名称 查看数据库名称 1;show databases; 发现有名称为ctftraining的数据库 2.对表进行查询 1;show tabl…

【ARM】MDK-烧录配置文件无权限访问

【更多软件使用问题请点击亿道电子官方网站】 1、 问题场景 客户代码编译正常、调试出现报错<Error: Flash Download failed - "Cortex-M4"> 仿真器识别正常&#xff0c;keil-Debug内显示相关信息、设备启动正常。 记录排查步骤&#xff0c;找到配置文件位…

深度解析 ICP 备案、公安备案、等保备案编号与统一社会信用代码

1. 前言 在当今数字化时代&#xff0c;各类网站和系统如雨后春笋般涌现&#xff0c;为了确保网络安全、合法运营以及用户信息保护&#xff0c;不同类型的备案工作应运而生。其中&#xff0c;ICP 备案、公安备案和等保备案尤为重要&#xff0c;它们各自对应的备案编号不仅是一串…

11个简单易用的电商购物车设计案例

文章目录 前言正文1.扁平化设计购物车2.无表格布局购物车3.美食购物车4.响应式购物车5.jQuery购物车6.动态价格更新购物车7.标签式滑动购物车8.动态商店与购物车一体化设计9.简约清爽的购物车设计10.基于Vue.js的购物车11.域名购物车 总结 前言 现在的电子商务网站&#xff0c…

turtlesim修改窗口大小;添加自己的小乌龟;

目前手边有humble版本ROS。以此为教程。其他版本以此类推 github中搜索ros&#xff0c;然后选择ros官网&#xff08;九点方阵那个图标&#xff09;。然后 在branch中&#xff0c;选择humble&#xff0c;然后复制链接。 git clone https://github.com/ros/ros_tutorials.git -…

电阻按材料分类、不同的电阻

TOC 按电阻材料工艺进行分类 3.1.线绕电阻&#xff1a; 使用高电阻率的康铜、锰铜或镍铬合金丝缠绕在陶瓷骨架&#xff08;一般采用陶瓷、塑料、涂覆绝缘层的金属骨架&#xff09;上制作而成的。玻璃釉绕线电阻表面被覆一层玻璃釉&#xff1b;涂漆线绕电阻表面被覆一层保护有…

spark的学习-06

SparkSQL读写数据的方式 1&#xff09;输入Source 方式一&#xff1a;给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二&#xff1a…

react-markdown内容宽度溢出和换行不生效问题

情景复现&#xff1a; 解决办法&#xff0c;添加样式进行限制 /* index.css */ .markdown-container {word-break: break-word; /* 强制长单词断行 */white-space: pre-wrap; /* 保留空白符序列&#xff0c;但是正常地进行换行 */overflow-wrap: break-word; /* 在长单词或…

vite-plugin-electron 库作用

vite-plugin-electron库是一个用于将 Vite 和 Electron 进行无缝结合的插件。 一、便捷的项目集成与开发环境搭建 1. 快速初始化项目 使开发者能够在已有的 Vite 项目基础上轻松添加 Electron 支持&#xff0c;无需复杂的配置和手动整合操作。 例如&#xff1a;开发者可以快…