Django学习笔记

Django学习笔记

  • 1 Django的快速入门
    • 1.1 模型类的设计和表生成
      • 1.1.1 模型类
      • 1.1.2 表生成
    • 1.2 通过模型类操作数据表
    • 1.3 模型类关系和关系查询
      • 1.3.1 模型类关系
    • 1.4 Django后台管理(ip:端口/admin)
    • 1.4 视图
    • 1.5 模板
      • 1.5.1 手动方式
      • 1.5.2封装方式
      • 1.5.3 html文件内的布置
  • 2 模型详解
    • 2.1 Django连接Mysql数据库
    • 2.2 模型类字段、属性及其约束
    • 2.3 查询函数
    • 2.4 Q对象,实现多条件查询
    • 2.5 F对象,实现属性之间的比较
    • 2.6 聚合函数
    • 2.7 查询集相关
    • 2.8 模型类关系
    • 2.9 一对多的关联查询
    • 2.10 插入、更新、删除
    • 2.10 自关联
    • 2.11 管理器objects
    • 2.12 元选项
  • 3 视图详解
    • 3.1 视图的使用
  • 3.2 错误的视图
  • 3.3 捕获url参数
  • 3.4 视图函数的request对象
  • 3.5 Ajax异步请求
    • 3.6 Cookie与Session
  • 4 模板详解
    • 4.1 模板文件的使用
    • 4.2 模板文件加载顺序
    • 4.3 模板语言
      • 4.3.1 模板变量
      • 4.3.2 模板标签
      • 4.3.3 过滤器
      • 4.3.4 自定义过滤器
      • 4.3.5 模板语言的注释
    • 4.4 模板的继承
    • 4.5 模板的转义
    • 4.6 装饰器
    • 4.7 csrf伪造
    • 4.8 URL反向解析
  • 5 静态文件,中间件及后台
    • 5.1 静态文件
    • 5.2 中间件
  • 5.3 后台管理系统
  • 6 上传图片及分页
    • 6.1 上传图片
    • 6.2 分页

1 Django的快速入门

1.1 模型类的设计和表生成

1.1.1 模型类

  1. 设计的类放到app里面的models.py,并且要继承django.db.models.Model类,示例如下:
  2. 字段规范: 字段名=models.字段类型(属性=XX)
from django.db import models

class MyModel(models.Model):
    name = models.CharFild(max_length=10)

1.1.2 表生成

  1. 生成迁移文件: python manage.py makemigrations
  2. 执行迁移生成表: python manage.py migrate

1.2 通过模型类操作数据表

  1. 模型类的对象中有一个叫save的方法,如果使用save方法,该对象会被保存到数据库中的对应表格内或者更新
  2. 模型类对象的delete方法可以删除对应的数据
  3. 模型类对象的object字段可以用于进行数据库的查询
from appname.models import MyModel

# 准备阶段
save_test = MyModel()
save_test.name = '保存测试'
delete_test = MyModel()
delete_test.name = '删除测试'

# 添加
save_test.save()
delete_test.save()

# 查询
search_result = MyModel.object.get(name='删除测试')

# 修改
update_result = MyModel.object.get(name='保存测试')
update_result.name = '更新测试'
update_result.save()

# 删除
delete_result = MyModel.object.get(name='删除测试')
delete_result.delete()

1.3 模型类关系和关系查询

1.3.1 模型类关系

  1. 一对多关系: 在多方的类中加入字段=>字段名=models.ForeignKey('类名称'),在使用时可以将外键字段直接用外键对象赋值
  2. 一对象获取多对象: 一对象.外键字段名称
  3. 多对象获取所有一对象: 多对象[类名要小写].一对象_set.all()
from django.db import models

class OneForeighKeyTest(models.Model):
    name = models.CharFild(max_length=10)

class ManyForeighKeyTest(models.Model):
    name = models.CharFild(max_length=10)
    one = models.ForeighKey('OneForeighKeyTest')
from appname.models impor OneForeighKeyTest, ManyForeighKeyTest

# 一获取多
one = OneForeighKeyTest.object.get()
many_result = one.manyforeighkeytest_set.all()

# 多获取一
many = ManyForeighKeyTest.object.get()
one_result = many.one

1.4 Django后台管理(ip:端口/admin)

  1. 语言和时区的本地化(通过修改setting.py进行实现):
LANGUAGE_CODE='zh-hans'
TIME_ZONE='Asia/Shanghai'
  1. 创建管理员: python manage.py createsuperuser
  2. 注册模型类: 在app下的admin.py中添加django.contrib.admin.site.register(模型类)
  3. 自定义管理页面: 在在app下的admin.py中添加[类名]Admin类,继承admin.ModelAdmin,
    [类名]Admin类中添加列表字段list_display,内容为[类名]里的字段名,并在register方法中添加[类名]Admin类名作为第二个参数
from django.contrib import admin, ModelAdmin
from appname.models import MyModel

class MyModelAdmin(ModelAdmin):
    list_display = ['name', ...]

admin.site.register(MyModel, MyModelAdmin)

1.4 视图

  1. 视图函数的定义: 视图函数通常定义在view.py文件里,且必须含有参数request,它是HttpRequest类型的数据,视图函数需要返回一个HttpResponse对象。
from django.http import HttpResponse

def index(request, [后面可以配合括号捕捉参数]):
    return HttpResponse(‘这是首页’)
# 重定向
from django.http import HttpResponseRedirect
from django.shortcut import redirect

def redict_one(request, [后面可以配合括号捕捉参数]):
    return HttpResponseRedirect(‘跳转的网页’)

def redict_two(request, [后面可以配合括号捕捉参数]):
    return redirect('跳转的网页')
  1. 配置url,建立url和视图的映射关系: 在urls.py文件里添加urlpatterns列表,里面的值为url('网页url',对应的视图函数[注意,视图函数不要加括号])或者url('网页url',include(app名称.urls.py))
  2. 通过url传递参数: url(网页url正则(参数正则)网页url正则, 视图函数),可以有多个参数,它会依次在传递给视图函数中request后面的参数
from django.urls import path, include

urlpatterns = [
    # 可以有多个参数,参数会按照顺序从前往后传递给视图函数requet后面的参数
    path('^正则(参数正则)正则$', 视不加括号的图函数),
    path('^', include(’别的urls文件‘)),
]

1.5 模板

1.5.1 手动方式

  1. 配置模板路径文件夹: 在setting.pyTEMPLATESDIRS键对应的列表中添加文件夹的路径
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
        },
    },
]
  1. 加载模板文件: django.template.loader.get_template(HTML文件路径)
  2. 定义上下文,传递数据进入模板文件: RequestContext(request, {键值对)
  3. 模板渲染并返回客户端: return HttpResponse(模板对象.render(上下文对象))
from django.http import HttpResponse
from django.template import loader, RequestContext

def template_one(request):
    model = loader.get_template(HTML文件路径)
    context = RequestContext(request, {键值对)
    html = model.render(context)
    return HttpResponse(html)

1.5.2封装方式

from django.shorcut import render

def template_two(request):
    return render(request, HTML路径, context={键值对})

1.5.3 html文件内的布置

  1. 普通变量的使用: { { context的键 }}
  2. 循环语句的使用:
{% for i in 列表对应的键 %} 
    {
    { i[在这里,i代表列表的某个值] }} 
{% endfor %}
  1. 对象变量的使用: { { 对应键.字段名 }}
  2. 列表变量的使用: { { 对应键.下标 }}或者用循环

2 模型详解

2.1 Django连接Mysql数据库

在setting.py文件中配置如下内容

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        # 使用的数据库要实现建立好,Django不能自动建立数据库
        'NAME': '使用的数据库名称',
        'USER': '用户名',
        'PASSWORD': '密码',
        'HOST': 'IP地址',
        'PORT': 端口号,
    }
}

在__init__.py中导入mysql包

import pymysql

# 如果有版本错误,就把下面一行取消注释
# pymysql.version_info = (1, 4, 13, 'final', 0)
pymysql.install_as_MySQLdb()

2.2 模型类字段、属性及其约束

字段名称的限制:

  1. 不能是python保留关键字
  2. 不能使用连续的下划线
  3. 需要指定字段的类型,语法为: 字段名 = models.字段类型(属性)
from django.db import models

AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
BooleanField:布尔字段,值为True或False。
NullBooleanField:支持Null、True、False三种值。
CharField(max_length=字符长度):字符串,
    参数max_length表示最大字符个数。
TextField:大文本字段,一般超过4000个字符时使用。
IntegerField:整数。
DecimalField(max_digits=None, decimal_places=None):十进制浮点数,
    参数max_digits表示总位数,
    参数decimal_places表示小数位数。
FloatField:浮点数。
DateField[auto_now=False, auto_now_add=False]):日期。
    参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
    参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
    参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
TimeField:时间,参数同DateField.
DateTimeField:日期时间,参数同DateField。
FileField:上传文件字段。
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。

约束

通过选项实现对字段的约束,选项如下:

null:如果为True,表示允许为空,默认值是False。
blank:如果为True,则该字段允许为空白,默认值是False。
对比:null是数据库范畴的概念,blank是表单验证证范畴的。
db_column:字段的名称,如果未指定,则使用属性的名称。
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
default:默认值。
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。

2.3 查询函数

通过模型类.objects属性可以调用如下函数进行查询:

get 返回满足条件的一条数据,返回的是一个模型类的对象
    如果查询到多个数据就会抛出MultipleObjectsReturned
    如果没查到则抛出DoesNotExists
all 返回模型类的全部数据,返回类型是JquerySet
filter 返回满足条件的数据,返回类型是JquerySet
exclude 返回不满足条件的数据,返回类型是JquerySet
order_by 排序,返回类型是JquerySet
    按照id从小到大排序 order_by('id')
    按照id从大到小排序 order_by('-id')

查询的条件

条件格式:模型类属性名__条件名=值
判等条件名 exact
包含 contains
开头以 startwith
结尾以 endwith
空查询 isnull,例如 Book.objects.filter(name__isnull=True)
范围查询 in,例如 Book.objects.filter(name__in=['TCP协议', 'IP协议'])
大于小于等于 gt(greate than)大于  lt(less than)小于  gte 大于等于  lte 小于等于
日期查询 year 年  month 月  day 日  gt 日期大于...  

2.4 Q对象,实现多条件查询

作用: 用于条件多条件查询,每一个Q对象都封装一个条件,Q对象之间用&(与)|(或)~(非)

from django.db.models import Q

# id不等于1或name包含c的数据
Book.objects.filter(~Q(id__exact=1) | name__contins='c')

2.5 F对象,实现属性之间的比较

作用: 用于类属性之间的比较

from django.db.models import F

# id大于等于1或count两倍的数据
Book.objects.filter(Q(id__gte=2*F('count')))

2.6 聚合函数

作用: 对查询结果进行聚合操作
sum count avg max min
agreegate: 调用这个函数来使用聚合,返回一个字典。

from django.db.models import Count
from appname.models immport Book

# 获取图书的数量
Book.objects.all().agreegate(Count('id'))

2.7 查询集相关

  1. 查询集是惰性的,直接查询是不会查询的,只有使用后才会发生查询
  2. 如果查询内容和前面的一样,则会返回缓存的数据
  3. 查询集可以切片或用下表取数据,但下标不能为负数
  4. exist方法可以判断查询集是否有数据

2.8 模型类关系

  1. 一对多关系,班级对学生关系,`s_class=ForeignKey(‘Class’)
  2. 多对多,在任何一个中定义即可,ManyToManyField(‘类名’)
  3. 一一对应,在任何一个中定义即可,OneToOneField(‘类名’)

2.9 一对多的关联查询

在这里,我们定义一对应的类叫一类,多对应的类叫多类,多类中建立关联的属性叫关联属性

由一类对象查询多类:一类的对象.多类类名小写_set.all()
由多类对象查询一类:多类对象.关联属性
有多类对象查询一类id:多类对象.关联属性_id
通过模型类实现关联查询:
    查询生,要求学生关联的班级名称包含'信科'1班:
    Student.objects.filter(class__name__contains='信科1班')

2.10 插入、更新、删除

插入、更新模型对象用save()方法,删除模型对象用delete()方法

2.10 自关联

自关联是特殊的一对多,格式为 ForeignKey('self', null=True, blank=True)

2.11 管理器objects

  1. objects到底是什么
    objects是models.Manager对象,如果自定义管理器,那么Django将不会自动生成管理器
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=10)
    object = models.Manager()  # object是用来替换objects的对象,值为Manager或Manager的子类对象
  1. 重写models.Manager对象有什么用?
    可以自定义查询方式,通过子类继承、覆盖重写想要定制的方法即可完成
  2. models.Manager有一个叫做model的方法,返回models.Manager所在类的类名

2.12 元选项

在模型类中添加内部类Mate

from django.db import models

class MyClass(models.Model):
    title = CharField(max_length=10)

    class Meta:
        db_name = [指定table name]

3 视图详解

3.1 视图的使用

  1. 视图函数的定义: request参数必须有,是一个HttpRequest对象,参数名可以改,但是不建议改。
  2. 配置url,建立视图函数和url之间的映射关系,通常在urls.py文件中通过urlpatterns列表建立映射。
from django.urls import path, include
from user import views

urlpatterns = [
    path('^正则$', '视图函数'),
    path('^正则(正则参数1)正则(正则参数2)正则$', '视图函数'),
    path('^正则', include('urls文件')),
    path('^正则/', include('urls文件')),
    path('^正则/$', include('urls文件')),
]

3.2 错误的视图

  1. 404视图错误
    在templates的根目录下建立404.html即可修改默认的404页面,
    django自动调用404.html时候,会传递一个request_path的模板变量.



    
    自定义的404页面


页面{
    { request_path }}找不到!


  1. 500错误
    在视图函数出错误时会抛出500异常,需要建立一个500.html文件在templates下.

3.3 捕获url参数

进行url匹配的时候,可以把要的参数写成一个正则表达式组,django会自动捕捉参数传递给视图函数。

  1. 位置参数
    按照参数的先后顺序把参数传递给视图函数
/goods_book/001.html,要求匹配type book以及id 001
urlpatterns = [
    url('^book_(\w+)/(\d+).html', 'index')
]

def index(request, type, id):
    return HttpResopnse('XXX')
  1. 组参数
    可以通过指定参数名传递参数,正则表达式组格式为?P<变量名>正则
/goods_book/001.html,要求匹配type book以及id 001
urlpatterns = [
    url('^book_(?P\w+)/(\d+).html', 'index')
]

def index(request, type, id):
    return HttpResopnse('XXX')

3.4 视图函数的request对象

requestHttpRequest对象,包含了请求的信息.

  1. request.GET: 存储GET请求的参数,request.POST: 存储POST请求的参数
  2. 他们可以通过字典的方式取数据或用get方法取数据,如果没有那个键值对,字典的方法会抛出KeyError,get方法会返回None,如果get方法设置了默认值,则会返回指定的默认值.
def index(request):
    request.GET.get('username', '默认值')  # 如果没指定默认值,默认值为None;如果键值对不存在,则返回默认值.
    try:    
        request.GET['password']
    exccept KeyError as e:  # 如果键值对不存在则抛出KeyError
        print(e)

3.5 Ajax异步请求

ajax请求的格式

$.ajax({
     
    'url': 请求的url地址,
    'type': 请求的方式,  // POST/GET
    'dataType': 预期返回数据的格式,
    'data': 参数,
    'success': (function(data){
     
    	// 请求成功的回调函数,data是返回的数据
	})
})
  1. js文件是静态文件,需要在setting.py中配置静态文件的地址
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
  1. 示例

                    
                    

你可能感兴趣的:(学习笔记,python,django,后端)