【Django】学习笔记

embedded/2024/10/19 1:28:05/

文章目录

    • @[toc]
      • MVC与MTV
        • MVC设计模式
        • MTV设计模式
      • Django下载
      • Django工程创建与运行
        • 创建工程
        • 运行工程
      • 子应用创建与注册安装
          • 创建子应用
          • 注册安装子应用
      • 数据模型
        • ORM框架
        • 模型迁移
      • Admin站点
        • 修改语言和时区
        • 设置管理员账号密码
        • 模型注册
        • 显示对象名称
        • 模型显示中文
        • App显示中文
      • 视图函数与路由系统
        • 定义视图函数
        • 配置路由系统
      • 模板渲染
        • 配置模板路径
        • 建立视图
        • 建立模板
      • 配置文件与静态文件
        • BASE_DIR
        • DEBUG
        • 静态文件
      • 数据库配置
        • 建立数据库book_manager
        • 配置settings.py
        • 安装MySQL驱动
        • 数据插入
      • 数据增加
        • save()方法
        • objects.create()方法
      • 数据修改
        • save()方法
        • objects.filter().update()方法
      • 数据删除
        • delete()方法
        • objects.filter().delete()方法
      • 数据库查询
        • 基础查询
          • objects.all()方法
          • objects.count()方法
          • objects.exclude()方法
          • objects.filter()方法
        • 过滤查询
          • exact
          • contains
          • endswith
          • isnull
          • in
          • gt
          • year
          • gte
        • F对象
        • Q对象
          • 逻辑与
            • objects.filter()方法
            • Q对象
          • 逻辑或
          • 逻辑非
        • 聚合函数
        • 排序函数
          • 正序
          • 倒序
        • 关联查询
          • 访问
            • 一对多的访问
            • 多对一的访问
          • 过滤查询
            • 多对一的查询
            • 一对多的查询
        • 切片
        • 分页
        • 惰性执行
        • 缓存
      • HttpRequest
        • 路由参数
          • 配置views.py
          • 配置urls.py
        • 查询字符串
          • 配置views.py
          • url
        • 表单数据
          • 配置views.py
          • 关闭CSRF
        • JSON数据
          • 配置views.py
        • 请求头数据
          • 配置views.py
        • 转换器
          • 配置converters.py
          • 配置views.py
          • 配置urls.py
      • HttpResponse
        • 配置views.py
      • JsonResponse
        • 配置views.py
      • Redirect
        • 配置views.py
      • Cookie
        • 设置Cookie
          • 配置views.py
        • 获取Cookie
          • 配置views.py
      • Session
        • 设置Session
          • 配置views.py
        • 获取Session
          • 配置views.py
        • 保存Session到Redis
          • 配置settings.py
      • 类视图
        • 类视图定义
          • 配置views.py
          • 配置urls.py
        • 多继承
          • 配置views.py
      • 中间件
        • 中间件定义
          • 配置middleware.py
          • 配置settings.py

MVC与MTV

MVC设计模式

1

MTV设计模式

2


Django_17">Django下载

pip install django==2.2.5

Django_25">Django工程创建与运行

创建工程
django-admin startproject book_manager
运行工程
python manage.py runserver

子应用创建与注册安装

创建子应用
python manage.py startapp book
注册安装子应用
  • 配置settings.py中的INSTALLED_APPS
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','book.apps.BookConfig',
]

数据模型

ORM框架
  • 配置models.py
from django.db import models# Create your models here.# 书籍信息表
class BookInfo(models.Model):name = models.CharField(max_length=10, verbose_name='书籍名称')pub_date = models.DateField(null=True, verbose_name='出版日期')read_count = models.IntegerField(default=0, verbose_name='阅读量')comment_count = models.IntegerField(default=0, verbose_name='评论量')is_delete = models.BooleanField(default=False, verbose_name='是否删除')def __str__(self):return self.nameclass Meta:db_table = 'book_info'verbose_name = '书籍信息管理'verbose_name_plural = verbose_name# 人物信息表
class PersonInfo(models.Model):GENDER_CHOICES = ((0, 'male'),(1, 'female'))name = models.CharField(max_length=10, verbose_name='人物名称')gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='人物性别')description = models.CharField(max_length=100, null=True, verbose_name='人物描述')book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='人物所属书籍')is_delete = models.BooleanField(default=False, verbose_name='是否删除')def __str__(self):return self.nameclass Meta:db_table = 'person_info'verbose_name = '人物信息管理'verbose_name_plural = verbose_name
模型迁移
  • Tools->Run manage.py Task
makemigrations
migrate

Admin站点

修改语言和时区
  • 配置settings.py
LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'
设置管理员账号密码
  • Tools->Run manage.py Task
createsuperuser
模型注册
  • 配置admin.py
from django.contrib import admin# Register your models here.from .models import BookInfo, PersonInfoadmin.site.register(BookInfo)
admin.site.register(PersonInfo)
显示对象名称
from django.db import models# Create your models here.# 书籍信息表
class BookInfo(models.Model):name = models.CharField(max_length=10)def __str__(self):return self.name# 人物信息表
class PersonInfo(models.Model):name = models.CharField(max_length=10)gender = models.BooleanField()book = models.ForeignKey(BookInfo, on_delete=models.CASCADE)def __str__(self):return self.name
模型显示中文
from django.db import models# Create your models here.# 书籍信息表
class BookInfo(models.Model):name = models.CharField(max_length=10)def __str__(self):return self.nameclass Meta:verbose_name = '书籍信息管理'verbose_name_plural = verbose_name# 人物信息表
class PersonInfo(models.Model):name = models.CharField(max_length=10)gender = models.BooleanField()book = models.ForeignKey(BookInfo, on_delete=models.CASCADE)def __str__(self):return self.nameclass Meta:verbose_name = '人物信息管理'verbose_name_plural = verbose_name
App显示中文
  • 配置apps.py
from django.apps import AppConfigclass BookConfig(AppConfig):name = 'book'verbose_name = '书籍管理'

视图函数与路由系统

定义视图函数
  • 配置views.py
from django.shortcuts import render# Create your views here.from django.http import HttpResponsedef index(request):return HttpResponse('OK!')
配置路由系统
  • 创建子路由:在book文件夹下建立urls.py文件
from django.urls import path
from . import viewsurlpatterns = [path('index/', views.index),
]
  • 配置总路由
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('book.urls'))
]

模板渲染

配置模板路径
  • 在项目根路径下建立templates文件夹
  • 配置settings.py
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'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',],},},
]
  • templates文件夹下建立book文件夹
建立视图
def index_2(request):context = {'name': '从心','age': '22'}return render(request, template_name='book/index_2.html', context=c ontext)
建立模板
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>index_2</title>
</head><body><div>书籍列表<ul><li>西游记</li><li>三国演义</li></ul></div><div>个人信息<div>{{ name }}</div><div>{{ age }}</div></div></body></html>

配置文件与静态文件

BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG
DEBUG = True
  • 默认工作在DEBUG模式下
  • 修改源代码程序会自动重启
  • Django程序出现异常时会向前端显示详细的错误追踪信息
DEBUG = FalseALLOWED_HOSTS = ['*']
  • ALLOWED_HOSTS为指定的IP访问白名单
静态文件
  • 在项目根目录下建立static文件夹
  • STATIC_URL是静态文件访问路由
  • STATICFILES_DIRS是静态文件存放路径
STATIC_URL = '/static/'STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')
]
  • 通过http://127.0.0.1:8000/static/1.jpg访问静态文件

数据库配置

建立数据库book_manager
  • 字符集:utf8mb4
  • 排序规则:utf8mb4_bin
配置settings.py
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','HOST': 'localhost','PORT': 3306,'USER': 'root','PASSWORD': 'root','NAME': 'book_manager',}
}
安装MySQL驱动
  • 配置__init__.py
import pymysqlpymysql.install_as_MySQLdb()
  • 测试运行,修改最后一个链接
if query is not None:query = query.encode(errors='replace')
数据插入
insert into book_info (name, pub_date, read_count, comment_count, is_delete) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);
insert into person_info (name, gender, description, book_id, is_delete) values
('郭靖', 0, '降龙十八掌', 1, 0),
('黄蓉', 1, '打狗棍法', 1, 0),
('黄药师', 0, '弹指神功', 1, 0),
('欧阳锋', 0, '蛤蟆功', 1, 0),
('梅超风', 1, '九阴白骨爪', 1, 0),
('乔峰', 0, '降龙十八掌', 2, 0),
('段誉', 0, '六脉神剑', 2, 0),
('虚竹', 0, '天山六阳掌', 2, 0),
('王语嫣', 1, '神仙姐姐', 2, 0),
('令狐冲', 0, '独孤九剑', 3, 0),
('任盈盈', 1, '弹琴', 3, 0),
('岳不群', 0, '华山剑法', 3, 0),
('东方不败', 1, '葵花宝典', 3, 0),
('胡斐', 0, '胡家刀法', 4, 0),
('苗若兰', 1, '黄衣', 4, 0),
('程灵素', 1, '医术', 4, 0),
('袁紫衣', 1, '六合拳', 4, 0);

数据增加

save()方法
from book.models import BookInfo
book_info = BookInfo(name='完美世界',pub_date='2013-8-16'
)
book_info.save()
objects.create()方法
from book.models import BookInfo
BookInfo.objects.create(name='斗破苍穹',pub_date='2014-5-4'
)

数据修改

save()方法
from book.models import BookInfo
book_info = BookInfo.objects.get(id=5)
book_info.name = '斗罗大陆'
book_info.save()
objects.filter().update()方法
from book.models import BookInfo
BookInfo.objects.filter(id=6).update(name='炼气十万年')

数据删除

delete()方法
from book.models import BookInfo
book_info = BookInfo.objects.get(id=6)
book_info.delete()
objects.filter().delete()方法
from book.models import BookInfo
BookInfo.objects.filter(id=5).delete()

数据库查询

基础查询
objects.all()方法
from book.models import BookInfo
BookInfo.objects.all()
objects.count()方法
from book.models import BookInfo
BookInfo.objects.all()
objects.exclude()方法
from book.models import BookInfo
BookInfo.objects.exclude(id=1)
objects.filter()方法
from book.models import BookInfo
BookInfo.objects.filter(id=1)[0]
过滤查询
exact
from book.models import BookInfo
BookInfo.objects.get(id__exact=1)
contains
from book.models import BookInfo
BookInfo.objects.filter(name__contains='湖')
endswith
from book.models import BookInfo
BookInfo.objects.filter(name__endswith='部')
isnull
from book.models import BookInfo
BookInfo.objects.filter(name__isnull=True)
in
from book.models import BookInfo
BookInfo.objects.filter(id__in=[1, 3, 5])
gt
from book.models import BookInfo
BookInfo.objects.filter(id__gt=3)
year
from book.models import BookInfo
BookInfo.objects.filter(pub_date__year=1980)
gte
from book.models import BookInfo
BookInfo.objects.filter(pub_date__gte='1990-1-1')
F对象
from book.models import BookInfo
from django.db.models import F
BookInfo.objects.filter(read_count__gt=F('comment_count') * 2)
Q对象
逻辑与
objects.filter()方法
from book.models import BookInfo
BookInfo.objects.filter(read_count__gt=20, id__lt=3)
# BookInfo.objects.filter(read_count__gt=20).filter(id__lt=3)
Q对象
from book.models import BookInfo
from django.db.models import Q
BookInfo.objects.filter(Q(read_count__gt=20) & Q(id__lt=3))
逻辑或
from book.models import BookInfo
from django.db.models import Q
BookInfo.objects.filter(Q(read_count__gt=20) | Q(id__lt=3))
逻辑非
from book.models import BookInfo
from django.db.models import Q
BookInfo.objects.filter(~Q(id=1))
聚合函数
from book.models import BookInfo
from django.db.models import Sum, Max, Min, Avg, Count
BookInfo.objects.aggregate(Sum('read_count'))
排序函数
正序
from book.models import BookInfo
BookInfo.objects.all().order_by('read_count')
倒序
from book.models import BookInfo
BookInfo.objects.all().order_by('-read_count')
关联查询
访问
一对多的访问
from book.models import BookInfo
book = BookInfo.objects.get(id=1)
book.personinfo_set.all()
多对一的访问
from book.models import PersonInfo
person = PersonInfo.objects.get(id=1)
person.book
# person.book_id
person.book.id
过滤查询
多对一的查询
from book.models import BookInfo
book = BookInfo.objects.filter(personinfo__name='郭靖')
book
book = BookInfo.objects.filter(personinfo__description__contains='八')
book
一对多的查询
from book.models import PersonInfo
people = PersonInfo.objects.filter(book__name='天龙八部')
people
people = PersonInfo.objects.filter(book__read_count__gt=20)
people
切片
from book.models import BookInfo
BookInfo.objects.all()[0:2]
分页
from book.models import BookInfo
from django.core.paginator import Paginator
books = BookInfo.objects.all()
paginator = Paginator(books, 2)
page_1_books = list(paginator.page(1))
page_1_books
paginator.num_pages
惰性执行
  • 如果用变量接收查询语句的返回结果,那么查询语句不会立即执行,而是等到调用该变量时执行
from book.models import BookInfo
books = BookInfo.objects.all()
books
缓存
  • 变量的值存放在系统内存中,如果通过变量进行查询,那么不会对数据库进行查询,而是从内存中查询
from book.models import BookInfo
books = BookInfo.objects.all()
[book.id for book in books]
[book.id for book in books]

HttpRequest

路由参数
配置views.py
def url_data(request, cat_id, sku_id):print(cat_id, sku_id)return HttpResponse('OK!')
配置urls.py
path('<cat_id>/<sku_id>/', views.url_data)
查询字符串
配置views.py
def query_str_data(request):print(request.GET)a = request.GET.get('a')b = request.GET.get('b')print(a, b)a_list = request.GET.getlist('a')print(a_list)return HttpResponse('OK!')
url
http://localhost:8000/query_str_data/?a=1&b=2&a=3
表单数据
配置views.py
def form_data(request):print(request.POST)username = request.POST.get('username')password = request.POST.get('password')print(username, password)return HttpResponse('OK!')
关闭CSRF
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',
]
JSON数据
配置views.py
def json_data(request):json_data = request.bodydict_data = json.loads(json_data)print(dict_data['username'], dict_data['age'])return HttpResponse('OK!')
请求头数据
配置views.py
def headers_data(request):print(request.META)print(request.META['CONTENT_TYPE'])print(request.method)print(request.path)print(request.user)return HttpResponse('OK!')
转换器
配置converters.py
from django.urls.converters import register_converterclass TelConverter:regex = '1[3-9]\d{9}'def to_python(self, value):return int(value)def to_url(self, value):return str(value)register_converter(TelConverter, 'tel')
配置views.py
import convertersdef tel_data(request, tel_data):print(tel_data)return HttpResponse('OK!')
配置urls.py
path('<tel:tel_data>/',views.tel_data)

HttpResponse

配置views.py
def http_response(request):response = HttpResponse(content='OK!', content_type='text/plain', status=200)response['key'] = 'value'return response

JsonResponse

配置views.py
def json_response(request):books_info = [{'id': 1,'name': '射雕英雄传','pub_date': '1980-5-1'},{'id': 2,'name': '天龙八部','pub_date': '1986-7-24'}]return JsonResponse(data=books_info, safe=False)

Redirect

配置views.py
from django.shortcuts import redirectdef redirect_url(request):return redirect('https://www.baidu.com')

Cookie

设置Cookie
配置views.py
def set_cookie(request):username = request.GET.get('username')password = request.GET.get('password')print(username, password)response = HttpResponse('OK!')response.set_cookie('username', username)response.set_cookie('password', password)return response
获取Cookie
配置views.py
def get_cookie(request):print(request.COOKIES)username = request.COOKIES.get('username')password = request.COOKIES.get('password')return HttpResponse(f'username: {username}, password: {password}')

Session

设置Session
配置views.py
def set_session(request):username = request.GET.get('username')user_id = 1request.session['username'] = usernamerequest.session['user_id'] = user_iddel request.session['user_id']# request.session.clear()# request.session.flush()request.session.set_expiry(60)return HttpResponse('OK!')
获取Session
配置views.py
def get_session(request):username = request.session.get('username')user_id = request.session.get('user_id')return HttpResponse(f'username: {username}, user_id: {user_id}')
保存Session到Redis
配置settings.py
CACHES = {'default': {'BACKEND': 'django_redis.cache.RedisCache','LOCATION': 'redis://127.0.0.1:6379/1','OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient',}}
}SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

类视图

类视图定义
配置views.py
from django.views import Viewclass LoginView(View):def get(self, request):return HttpResponse(f'当前请求为: {request.method}')def post(self, request):return HttpResponse(f'当前请求为: {request.method}')
配置urls.py
path('login/', views.LoginView.as_view())
多继承
配置views.py
from django.contrib.auth.mixins import LoginRequiredMixinclass OrderLoginView(LoginRequiredMixin, View):def get(self, request):return HttpResponse('个人中心页面')def post(self, request):return HttpResponse('个人中心页面')

中间件

中间件定义
配置middleware.py
from django.utils.deprecation import MiddlewareMixinclass TestMiddleware(MiddlewareMixin):def process_request(self, request):print('每次请求前, 进行调用')username = request.COOKIES.get('username')if username is None:print('用户信息不存在')else:print('用户信息存在')def process_response(self, request, response):print('每次响应前, 进行调用')return response
配置settings.py
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','book.middlewares.TestMiddleware'
]


http://www.ppmy.cn/embedded/6129.html

相关文章

深入理解 pytest Fixture 方法及其应用

当涉及到编写自动化测试时&#xff0c;测试框架和工具的选择对于测试用例的设计和执行非常重要。在Python 中&#xff0c;pytest是一种广泛使用的测试框架&#xff0c;它提供了丰富的功能和灵活的扩展性。其中一个很有用的功 能是fixture方法&#xff0c;它允许我们初始化测试环…

软考 系统架构设计师系列知识点之大数据设计理论与实践(14)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据设计理论与实践&#xff08;13&#xff09; 所属章节&#xff1a; 第19章. 大数据架构设计理论与实践 第4节 Kappa架构 19.4.3 Kappa架构的实现 下面以Apache Kafka为例来讲述整个全新架构的过程。 部署Apach…

k8s之etcd

1.特点&#xff1a; etcd 是云原生架构中重要的基础组件。有如下特点&#xff1a; 简单&#xff1a;安装配置简单&#xff0c;而且提供了 HTTP API 进行交互&#xff0c;使用也很简单键值对存储&#xff1a;将数据存储在分层组织的目录中&#xff0c;如同在标准文件系统中监…

工业电脑在ESOP工作站行业应用

ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化&#xff0c;并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑&#xff0c;上层通过网络与MES系统连接&#xff0c;下层连接显示器展示作业指导书。ESOP控制终…

2011年认证杯SPSSPRO杯数学建模C题(第二阶段)你的爱车入保险了吗全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 C题 你的爱车入保险了吗 原题再现&#xff1a; 近几年&#xff0c;国内汽车销售市场异常火爆&#xff0c;销售量屡创新高。车轮上的世界&#xff0c;保险已经与我们如影随形。汽车保险&#xff0c;简称车险&#xff0c;是指对机动车辆由于自然…

centos常见命令及进阶命令

一、常见命令 CentOS&#xff0c;作为Linux的一个发行版&#xff0c;拥有许多强大的命令&#xff0c;可用于管理系统、文件、服务等。以下是一些CentOS常用的命令及其详解&#xff1a; ls&#xff1a;列出目录内容。 -l&#xff1a;以长格式显示详细信息。-a&#xff1a;显示所…

Linux编辑器gcc/g++的使用以及Makefile的用法

gcc如何完成 格式 gcc [选项] 要编译的文件 [选项] [目标文件] gcc对code.c编译形成可执行文件mybin&#xff0c;十分推荐直接这样写&#xff0c;下面会有拆分写法&#xff08;不推荐&#xff09; gcc与我们使用过的编辑器无二&#xff0c;都需要经过 1. 预处理&#xff08;…

Spark/SparkSQL读取Hadoop LZO文件概述

一、前置配置 IDEA Maven安装配置 Scala&#xff08;可选&#xff09; Java Hadoop.dll&#xff08;可能需要&#xff0c;具体看有无相关错误信息&#xff09; hadoop-lzo-0.xx.xx.jar&#xff08;如果你的版本过高&#xff0c;需要到官网下载高版本&#xff0c;mvnrepository仓…