Django学习02:ListView、模板语言、QuerySet

     阅读:40

学习视频:Django3.2 快速入门(四小时快速掌握核心内容) P4-P6
ListView、模板语言、QuerySet

1. 疫情人员登记表

视频p4中运行出疫情人员登记表
创建应用
在终端输入

py manage.py startapp personal_info

setting中添加应用(在INSTALLED_APPS里面添加)

personal_info.apps.PersonalInfoConfig', #加入创建的应用

连接数据库mysql
seting中更改DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        # mysql数据库名称
        'NAME': 'person',
        # 登陆mysql的用户名
        'USER': 'root',
        # 登陆mysql的用户名密码
        'PASSWORD': '0313',
        # mysql ip地址,不填表示使用默认地址,默认为localhost
        'HOST': 'localhost',
        # mysql端口号,不填表示使用默认端口,默认为3306
        'PORT': '3306',
    }
}
  1. 安装pymysql库

file —> settings ----> project 解释器 —> 点击+ ----> 输入pymysql —>
install

  1. 在项目同名的文件夹下的__init__.py文件中添加如下代码
import pymysql
pymysql.install_as_MySQLdb()

models创建模型
因为涉及数据库交互!

from django.db import models
class Person(models.Model):
    GENDER_CHOICES={
        (1, '男'),
        (2, '女')
    }
    name=models.CharField(max_length=12)
    age=models.IntegerField()
    gender=models.BooleanField(choices=GENDER_CHOICES)
    id_card=models.CharField(max_length=18)
    address=models.CharField(max_length=255)
    temperature=models.FloatField()

    class Meta:
        permissions=()  #把django系统生成的权限置为空

生成迁移文件和执行迁移文件
作用:在数据库中建立表
生成迁移文件

python manage.py makemigrations

执行迁移文件

python manage.py migrate

views.py
是model !!! 不是models

from django.views.generic import ListView
from personal_info.models import Person

class PersonList(ListView): #列表视图 查
    model=Person #定义model,决定从Person取数据  model!!! 不是models
    template_name = 'person_list.html' #模板,渲染到person_list.html

项目中的urls
在urlpatterns添加路径

path('person/', include('personal_info.urls'))

应用中的urls
as_view将类转化为视图

from django.urls import path

from personal_info.views import PersonList
app_name='personal_info' #应用名
urlpatterns = [
    path('', PersonList.as_view(),name='personList') #django的类视图拥有自动查找指定方法的功能,通过调用as_views()方法实现
]

访问路径是127.0.0.1:8000/person

2.模板语言进阶

根据P5教程在页面上运行出数据相加结果

  1. tags
  2. filter

views.py

from django.views.generic import ListView

from personal_info.models import Person

class PersonList(ListView):
    model=Person #定义model,从哪取数据  model!!! 不是models
    template_name = 'person_list.html' #模板,渲染到哪个地方
    def get_context_data(self, *, object_list=None, **kwargs):
        context=super().get_context_data(object_list=object_list,**kwargs)
        context.update({'lst':[1.23,2.4532,3.45223,4.21233]})
        return context

html文件中加入

{% load mytags %} #load加载mytags文件
{{ lst|add_filter }} #第一个参数是lst,即[1.23,2.4532,3.45223,4.21233]
{% add_tag lst %}

新建一个templatetags包,再包下新建mytags.py文件
mytags.py
加入装饰器

from functools import reduce

from django import template

register=template.Library()
#需要用到装饰器,否则会像普通的函数用不了
@register.filter(is_safe=False)
def add_filter(value,rounded=2):
    assert isinstance(value,list) #判断是否是列表
    return round(sum(value),rounded) #对浮点数进行近似取值,保留2位小数

@register.simple_tag
def add_tag(*args,**kwargs):
    args=args[0]
    assert isinstance(args,list) #判断是否是列表
    result=reduce(lambda x,y:x+y,args) #对元素进行累积
    rounded=kwargs.get('rounded')
    rounded=rounded or 2
    result=round(result,rounded)
    return result

结果是:11.35 11.35

3.Model与QuerySet

根据P6教程在pycharm上执行查询、保存等操作

  1. 数据库→仓库
  2. Model→仓库设计图
  3. instance→货物
  4. QuerySet→包裹(多个货物)

instance常用函数:
save()、get()、delete()、
QuerySet:
filter()、get()、all() 、delete()、 update()、 create()

  • get只能返回一个查询结果,并且如果不存在会报错
  • filter返回一个对象列表,如果不存在则会返回[ ]

终端中输入
进入到django的命令行

python manage.py shell 

执行增加,保存和查询等操作
注意带函数后加括号

>>> from personal_info.models import Person #导入Person
>>> p=Person(name='王五',age=21,gender=1,id_card='012345',address='河南省',temperature=36.5)
>>> p.save()
>>> p
<Person: Person object (3)>
>>> ps1=Person.objects.filter()
>>>> ps1.count()
3
>>> ps3=Person.objects.get(name='dd')
>>> ps3.age
20
>>> ps3.address
'4号路'
>>> ps4=Person.object.filter(Q(name='dd'|Q(temperature=38))

参考:
Django中Queryset的使用(一)
django学习之Model(三)QuerySet
Python reduce() 函数
Python round() 函数