python-djingo开发框架

目录结构

主工程

bookmanager/
├── bookmanager
│   ├── __init__.py
│   ├── settings.py		#项目测试环境整体配置
│   ├── urls.py			#项目URl配置
│   └── wsgi.py			#项目与WSGI兼容的web服务器入口			
└── manage.py			#项目测试环境管理文件,通过他管理项目

子工程

├── manage.py
└── pay
    ├── admin.py		#后台相关
    ├── apps.py			#当前子应用相关
    ├── __init__.py
    ├── migrations		#迁移相关,生成迁移文件
    │   └── __init__.py
    ├── models.py		#模型相关
    ├── tests.py		#测试相关
    └── views.py		#视图相关

初始化-项目名/主工程名/settings包/dev.py

创建正式测试环境管理配置文件

1、创建-项目名/主工程名/settings/

2、创建全局配置文件

测试环境:项目名/主工程名/settings.py---移到并重命名--->项目名/主工程名/settings/dev.py
正式环境:项目名/settings包/prod.py

3、修改项目启动管理文件

测试环境:项目名/manage.py
if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '主工程名.settings.dev')
正式环境:项目名/主工程名/wsgi.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '主工程名.settings.prod')

创建工具包-项目名/主工程名/utils/

jinja2安装配置

安装

pip install jinja2

配置

创建环境编码包:主工程名/utils/jinja2_env.py
from jinja2 import Environment
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse


def jinja2_environment(**options):
	# 创建环境对象
    env = Environment(**options)
    env.globals.update({
    	# 自定义语法获取静态文件路径头缀:{{ static('静态文件相对路径') }}
        'static': staticfiles_storage.url,
        # 自定义语法:{{ url('路由的命名空间') }}
        'url': reverse,
    })
    return env
项目名/主工程名/settings/dev.py
TEMPLATES = [
    {
    	#修改
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'OPTIONS':{
            'context_processors':[
            ],
            #添加,补充Jinja2模板引擎环境
            'environment': '主工程名.utils.jinja2_env.jinja2_environment',
        },
    },
]

修改常用配置参数

LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
#工程的url配置入口
ROOT_URLCONF = '工程名.urls'
#允许访问、debug
#True|False
DEBUG = True
ALLOWED_HOSTS = ['*']

设置注册安装子应用

创建应用管理包-项目名/主工程名/apps/

import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 追加导包路径指向apps包
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

INSTALLED_APPS = [
    ...
    '子应用名1',
    '子应用名2',
]

设置redis数据库

安装

pip install django-redis

根据需求redis存储配置,启用Session

INSTALLED_APPS = [
	#默认存储在数据库中
    'django.contrib.sessions',
]
#添加
######存储在数据库中
SESSION_ENGINE='django.contrib.sessions.backends.db'
######存储在redis中
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
#session存在那个库
SESSION_CACHE_ALIAS = 'session'
CACHES = {
	#默认存放
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://密码@ip:6379/那个库(0-15)',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    },
    #存session
    'session': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://密码@ip:6379/那个库(0-15)',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    },
}

#启用Session
MIDDLEWARE = [
	#默认以启动
    'django.contrib.sessions.middleware.SessionMiddleware',
]

设置mysql数据库

1、虚拟环境安装数据库

pip install PyMySQL

2、导入数据库-项目名/主工程名/init.py

#导入
from pymysql import install_as_MySQLdb
#调用
install_as_MySQLdb()

3、设置配置文件

DATABASES = {
    'default': {
    	####mysql数据库引擎
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '数据库ip',
        'PORT': '数据库端口',
        'USER': '数据库用户',
        'PASSWORD': '数据库密码',
        'NAME': '数据库库名',
        ####sqlite数据库引擎
        'ENGINE': 'django.db.backends.sqlite',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

设置模板的路径

创建目录:项目名/主工程名/templates

TEMPLATES = [
    {
        ####设置模板的路径
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
    },
]

设置静态文件的路径

创建目录:项目名/主工程名/static

#访问静态文件url
STATIC_URL = '/static/'
#设置静态文件的路径
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

注释项目默认admin路由和app注册

INSTALLED_APPS = [
    # 'django.contrib.admin',
]
#项目名/主工程名/urls.py
urlpatterns = [
    # path('admin/', admin.site.urls),
]

配置工程日志信息

创建日志软件包:项目名/logs/

修改配置

#最后添加
LOGGING = {
    'version': 1,
    # 是否禁用已经存在的日志器
    'disable_existing_loggers': False,
    # 日志信息显示的格式
    'formatters': {
        #详细:日志等级 时间 模块 模块行 事件
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        #简单:日志等级 模块 模块行 事件
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    # 对日志进行过滤
    'filters': {
        'require_debug_true': {
            # django在debug模式下才输出日志
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    # 日志处理方法
    'handlers': {
        # 向终端中输出日志
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            # 日志信息显示的格式
            'formatter': 'simple'
        },
        # 向文件中输出日志
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
             # 日志文件的位置
            'filename': os.path.join(os.path.dirname(BASE_DIR), 'logs/system.log'), 
            #300M
            'maxBytes': 300 * 1024 * 1024,
            #日志文件数
            'backupCount': 10,
            # 日志信息显示的格式
            'formatter': 'verbose'
        },
    },
    # 日志器
    'loggers': {
        # 定义了一个名为django的日志器
        'django': {
            # 可以同时向终端与文件中输出日志
            'handlers': ['console', 'file'],
            # 是否继续传递日志信息
            'propagate': True,
            # 日志器接收的最低日志级别
            'level': 'INFO',
        },
    }
}

使用-使用的文件中添加

#导入
import logging

# 创建日志记录器
logger = logging.getLogger('django')

# 输出日志
logger.debug('测试logging模块debug')
logger.info('测试logging模块info')
logger.error('测试logging模块error')

路由Route:根据请求地址查找视图

项目urs:项目名/urls.py

值为列表

浏览器的输入路径会和urlpatterns每一项顺序匹配

匹配成功引入相应模块,不成功返回404

#导入相关模块
from django.urls import include

urlpatterns = [
    # r'^开头-正则-/$结束符'
    url(r'^', include(('子应用名.urls', '子应用名'), namespace="命名空间-子应用名")),
]

子应用urs:子应用名/urls.py

#导入相关模块
from . import views
from django.conf.urls import url

urlpatterns = [
	#通过name找到路由
    # r'^开头-正则-/$结束符'
    url(r'^', views.类名.as_view(), name='名字'),
]

Model模型:用于数据库的交互

ORM,使用面向对象方式使用数据库

类——数据表,属性——字段,对象——数据行

字段类型、选项

关于主键

为表创建默认id自动增长的主键列

设置某属性为主键列,后面不会再创建自动增长的主键列

字段类型

字段类型类型说明参数值选项
自动增长AutoField通常不用指定,不指定时,自动创建id自动增长属性
布尔字段BooleanField、NullBooleanField值为True或False、
支持Null、True、False三种值
字符串CharField必须参数max_length:表示最大字符个数
大文本字段TextField一般超过4000个字符时使用
整数IntegerField
小整数SmallIntegerField
十进制浮点数DecimalField参数max_digits:总位数
参数decimal_places:小数位数
浮点数FloatField
日期DateField参数auto_now,默认为False:每次保存时,设置的的时间
参数auto_now_add,默认为False:第一次创建时,设置的时间,
#两个参数不能同时存在
外键ForeignKey主表删除数据时,外键引用表数据处理
models.ForeignKey(主表名, on_delete=models.CASCADE)
on_delete=models.xxx**
SET()** CASCADE级联:删除主表数据从表引用的数据删除
PROTECT保护:阻止删除主表中被外键应用的数据抛出ProtectedError异常
SET_NULL设置为NULL:字段null=True,删除主表数据从表引用的数据变成null
SET_DEFAULT设置为默认值:字段default=xxx,删除主表数据从表引用的数据变成默认值
**SET()**设置为特定值:删除主表数据从表引用的数据变成特定值
DO_NOTHING不做任何操作

选项

选项说明
verbose_name=‘xxx’字段中文名,数据库范畴
null=True字段值允许为空,数据库范畴
blank=True字段值允许为空,表单验证范畴
db_column字段的名称,如果未指定,则使用属性的名称
db_index若值为True, 则在表中会为此字段创建索引,默认值是False
default=xxx字段默认的值
primary_key若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique=True去重,该字段不允许有相同的值
choices=有序字典名字段值只能是有序字典中的值
有序字典名 = (
(0, ‘nale’),
(1, ‘female’)
)

定义模型类-数据表,要继承models.Model

from django.db import models

class BookInfo(models.Model):
    name = models.CharField(max_length=10, unique=True, verbose_name='名称')
    pub_data = models.DateField(null=True, verbose_name='发布日期')
    readcount = models.IntegerField(default=0, verbose_name='阅读量')
    commentcount = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    # 修改表名
    class Meta:
        # 指明数据库表名
        db_table = 'tb_BookInfo'
        # 在admin站点中显示的名称
        verbose_name = '图书'
	#调试时用
    def __str__(self):
        # 定义每个数据对象的显示信息
        return self.name


# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'nale'),
        (1, 'female')
    )

    name = models.CharField(max_length=20, 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='逻辑删除')

    # 修改表名
    class Meta:
        # 指明数据库表名
        db_table = 'peopleinfo'
        # 在admin站点中显示的名称
        verbose_name = '人物信息'

    def __str__(self):
        return self.name

模型迁移-把定义的数据表进行生成

#生成迁移文件
python manage.py makemigrations
#生成数据
python manage.py migrate

把相关数据库表添加到原有后台界面

#导入数据库表模型
from book.models import 数据库表模型名1,数据库表模型名2
#注册数据库表模型
admin.site.register(数据库表模型名1)
admin.site.register(数据库表模型名2)

View视图:接收请求,业务处理,返回结果

导入相关模块-子应用名/views.py

#render返回数据给模板,redirect重定向跳转到那个url页面
from django.shortcuts import render, redirect
#导入类函数
from django.views import View
#类函数时,判断有没登入成功,登入成功的话执行,没有的话跳到指定页面
from django.contrib.auth.mixins import LoginRequiredMixin
#根据路由名称,获取路由url路径
from django.urls import reverse
#导入http模块
from django.http import HttpResponse, JsonResponse
#导入数据库查询模块
from django.db.models import F, Q, Sum, Avg, Max, Min, Count
#导入分页类
from django.core.paginator import Paginator
#导入http模块
from django import http
#导入正则模块
import re
#导入模型类-数据库表
from 子应用名.models import 模型类名1, 模型类名2

1、进行函数视图|类视图创建

第一个参数必须有HttpRequest对象

函数视图

#子应用/views.py
def 函数名(request):

类视图

#注册:子应用/urls.py
urlpatterns = [
    # 类视图:注册
    path('register/', 类名.as_view()),
]

#视图实现:子应用/views.py
#继承LoginRequiredMixin、View
#LoginRequiredMixin判断有没登入成功,登入成功的话执行,没有的话跳到指定页面
class 类名(LoginRequiredMixin, View):
	#get请求方法时,执行
    def get(self, request):
        return HttpResponse('get')
	#post请求方法时,执行
    def post(self, request):
        return HttpResponse('post')
	#put请求方法时,执行
    def put(self, request):
        return HttpResponse('put')

2数据逻辑处理-Web的HttpRequest请求的数据处理

获取url的路径拆分值

#子应用/urls.py
urlpatterns = [
	#数据类型:变量名字
    path('new/<str:name>/<int:age>/', 函数名|类名),
]
#子应用/views.py
def 函数名(request, name, age):
    context = {
        'name':name,
        'age':age
    }
    print(context)

获取查询字符串url传递参数-get方式传递的参数

以?作为分隔符,?前面是路由,?后面是传递的参数

#子应用/views.py
#获取?后面全部参数,返回字典格式
对象名_all= request.GET
#直接获取指定参数的值
password = request.GET.get('password')
#获取里面的指点参数值,这个参数名有多个值
users = query_params.getlist('username')

获取表单body请求体数据-post方式传递的数据参数

POST数据表单数据
#子应用/views.py
对象名_all = request.POST
#获取里面的指点参数值
username = query_params['username']
password = query_params.get('password')
#获取里面的指点参数值,这个参数名有多个值
users = query_params.getlist('username')
json数据
#子应用/views.py
#json格式的字符串转换成字典格式(二进制格式数据转字符串)
data = json.loads(request.body.decode())
#字典数据转换成json格式的字符串
#data = json.dumps(body_str)
username = data['username']
password = data.get('password')
print(username, password)

获取请求头header数据

子应用/views.py
#全部请求头数据request.META,返回的大写的字典数据格式
content_type = request.META['HTTP_NAME']
print(content_type)

2数据逻辑处理–状态保持

cookie:保存在客户端浏览器中

流程

第一次请求过程
浏览器第一次请求:不携带cookie信息
服务器接收请求:发现没有cookie,返回时响应头中有set_cookie信息,设置一个cookie返回浏览器
浏览器接收:并保存cookie
第二次请求过程
浏览器再次请求:携带cookie信息,请求头中有cookie信息
服务器发现请求中携带了cookie

操作
子应用/views.py
#设置
def set_cookie(request):
    #获取请求url参数的名字值
    username = request.GET.get('username')
    #创建设置cookie对象
    response = HttpResponse('set_cookie')
    #cookie名,值,有效时间一小时
    response.set_cookie('username', username, max_age=3600)
	#删除cookie
    response.delete_cookie('username')
    
    #返回cookie对象
    return response
#删除
def set_cookie(request):
    #获取请求url参数的名字值
    username = request.GET.get('username')
    #创建设置cookie对象
    response = HttpResponse('set_cookie')
	#删除cookie
    response.delete_cookie('username')
#查看
def get_cookie(request):
    #创建获取cookie对象,返回字典数据
    cookies = request.COOKIES
    # 获取cookie里面参数值
    username = cookies.get('username')
    return HttpResponse(username)

Session:保存在服务器中,需要依赖于cookie

流程

第一次请求
客户端发送:带有用户名,密码的post请求给服务器
服务器验证后:把用户对象信息放入session中保存到内存,并在响应头中设置返回个key名seesionid的cookie信息
客户端把cookie存起来

操作-子应用/views.py
创建
def set_session(request):
	#显示获取cookie对象,返回字典数据
    print(request.COOKIES)
    user_id = 6666
    username = 6666
    #设置session
    request.session['user_id'] = user_id
    request.session['username'] = username
    #设置session的有效期,默认2周
	request.session.set_expiry(多少秒)
    return HttpResponse('set_session')
查看
def get_session(request):
    #显示获取cookie对象,返回字典数据
    print(request.COOKIES)
    #查询session信息
    user_id = request.session['user_id']
    print(user_id)
    return HttpResponse(user_id)
清除
def set_session(request):
    #显示获取cookie对象,返回字典数据
    print(request.COOKIES)
	#清除当前所有session的vlaue,保留key
	request.session.clear()
	#清除当前所有session的vlaue、key
	request.session.flush()
	#删除session中的指定键及值
	del request.session['键']

2数据逻辑处理-数据库操作

增加 create

表名类名字.objects.create(
	name='itheima',
	pub_data='1980-05-01'
)
#<PeopleInfo: itheima>

修改 update

表名类名字.objects.filter(name='itcast').update(
	name='传智播客',
	pub_data='1980-05-01'
)

删除delete

表名类名字.objects.filter(name='python入门').delete()
#(1, {'book.BookInfo': 1, 'book.PeopleInfo': 0})

查询-查询数据返回的是列表格式

查询单一结果get

不存在会抛出表名类名字.DoesNotExist异常

try:
	表名类名字.objects.get(id=1)
except 表名类名字.DoesNotExist:
	print('查询的数据不存在')
#<BookInfo: 射雕英雄传>
查询多个结果all
表名类名字.objects.all()
#<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>]>
聚合函数-对字段值进行统计计算:Avg平均,Max最大,Min最小,Sum求和,Count数量

aggregate的返回值是一个字典类型

表名类名字.objects.aggregate(avg=Avg('属性名称'), sum=Max('属性名称'))
表名类名字.objects.aggregate(Max('属性名称'))
表名类名字.objects.aggregate(Min('属性名称'))
表名类名字.objects.aggregate(Sum('属性名称'))
表名类名字.objects.count()
排序-对字段值进行排序
# 默认升序
表名类名字.objects.all().order_by('属性名称')
# 降序
表名类名字.objects.all().order_by('-属性名称')
过滤查询
格式、过滤符
表名类名字.objects.过滤符(属性名称__比较运算符=值)

过滤符:
过滤:filter过滤符合结果的
取反:exclude符合判断的并取反
get过滤单一结果
等于:exact

查出该字段为x的数据,运算符前加上i表示不区分大小写

表名类名字.objects.filter(属性名称=1)
#不等于
表名类名字.objects.filter(属性名称__iexact=1)
比较查询:gt大于、gte大于等于、lt小于、lte小于等于
表名类名字.objects.filter(属性名称__gt=3)
包含:contains

查出该字段包含x的数据,运算符前加上i表示不区分大小写

表名类名字.objects.filter(属性名称__contains='传')
以开|结尾:startswith、endswith

查出该字段以x开|结尾的数据,运算符前加上i表示不区分大小写

表名类名字.objects.filter(属性名称__endswith='部')
空|非空:isnull

查出该字段空|非空的数据

表名类名字.objects.filter(属性名称__isnull=True)
存在范围内:in

查出该字段为列表中的数据

表名类名字.objects.filter(属性名称__in=[1,3,5])
日期查询:year、month、day、week_day、hour、minute、second
表名类名字.objects.filter(属性名称__year=1980)
表名类名字.objects.filter(属性名称__gt='1990-1-1')
复杂过滤-基于过滤查询使用
两个属性值比较:F对象
表名类名字.objects.filter(属性名称1__gt=F('属性名称2'))
表名类名字.objects.filter(readcount__gt=F('commentcount')*2)
逻辑关系Q对象:and、or、not
#and与-,
表名类名字.objects.filter(属性名称1__gt=20,属性名称2__lt=3)
#or或-|
表名类名字.objects.filter(Q(属性名称1__gt=20)|Q(属性名称2__lt=3))
#not非-~
表名类名字.objects.filter(~Q(属性名称=3))
关联查询
关联普通查询

由一到多

一表查询集名 = 一表类名字.objects.get(id=1)
一表查询集名.多表类名字小写_set.all()

由多到一

多表查询集名 = 多表名类名字.objects.get(id=1)
多表查询集名.多表关联一表的属性字段名.一表属性字段名
关联过滤查询

由多到一

#一表实例对象名 = 一表类名字.objects.filter(多表类名字小写__属性名__条件运算符='八')
一表查询集名 = 一表类名字.objects.filter(多表类名字小写__属性名__contains='八')
一表查询集名

由一到多

多表查询集名 = 多表类名字.objects.filter(一表类名字小写__属性名__gt=30)
多表查询集名
分页查询
#获取数据,给查询集
查询集名 = 表名-类名字.objects.all()

#创建分页实例
分页对象名 = Paginator(查询集名,每页几条数据)
#获取指定页码的数据
分页查询集 = 分页对象名.page(第几页)
分页查询集.object_list
#获取有多少分页
numPages = 分页对象名.num_pages

3、返回Web的HttpResponse响应给请求者

视图在接收请求并处理后,必须返回HttpResponse对象或子对象

HttpResponseForbidden-403响应返回

return http.HttpResponseForbidden('缺少必传参数')

HttpResponse-返回数据

context = '哈哈哈'
#context:返回的内容:只能是字符串,不要传递对象、字典等数据
#status-响应状态码:100-599
#content_type-传递数据的类型:text/html、text/css、text/javascript、application/json、image/png、image/gif、image/jpeg
return HttpResponse(context, status=588, content_type='application/json')

JsonResponse-返回Json的数据

context = {
	'age':age,
	'name':name
}
#返回的内容:只能是字符串,不要传递对象、字典等数据
#status-响应状态码:100-599
#content_type-传递数据的类型:text/html、text/css、text/javascript、application/json、image/png、image/gif、image/jpeg
return JsonResponse(context, status=588, content_type='application/json')

redirect-重定向跳转到那个url页面

#通过url的name获取url路由路径
path = reverse('book_test')
# 跳转到那个url页面
return redirect(path)

render-后台返回传递一些数据给html

class HomeView(View):
    def get(self, request):
        username = request.GET.get('username')
        context = {
            'username': username,
            'age': 14,
            'birthday': datetime.now(),
            'firends': ['tom', 'jack', 'rose'],
            'money': {
                '2019': 12000,
                '2020': 18000,
                '2021': 25000,
            }
        }
        return render(request, 'index.html', context=context)

#中间件-介入请求和响应中的处理过程,每次请求和响应的时候都会调用

Django运行在调试模式下,中间件init可能被调用两次

创建文件-子应用名/middleware.py
def 函数名(get_response):
    def middleware(request):
    	#请求前调用这个
        print('before request 被调用')
        
        response = get_response(request)
        
        #响应后调用这
        print('after response 被调用')
        
        return response

    return middleware


#添加注册中间件-项目名/settings.py
#执行循序请求前调用往下,响应后调用往上
MIDDLEWARE = [
    'book.文件名.函数名',
]

Template模板:封装结果,生成页面html、css、js等

注意:使用form表单的post请求时,添加csrf的配置{% csrf_token %}

<form action="" method="post">
	# Django 模板语言
	{% csrf_token %}
	#Jinja2 模板语言
	{{ csrf_input }}

Jinja2模板

比默认模板引擎快10-20倍,功能齐全

循环

for
<ul>
{% for item in 列表名 %}
	<!--loop.index显示当前第几次循环数字,从1开始-->
	<li>{{ loop.index }} {{ item }}</li>
{% endfor %}
</ul>
判断
<!--比较运算符:==、!=、<、>、<=、>=-->
<!--布尔运算符:and、or、not-->
{% if 变量名 > 10 %}
	...
{% elif ... %}
{% else %}
	...
{% endif %}

取值

变量名
{{ 变量名 }}
列表取值
all:{{ 列表对象名 }}
指定:{{ 列表对象名.下标 }}
字典取值
all:{{ 字典对象名 }}
指定:{{ 字典对象名.key名 }}
过滤器
禁用转义safe:把具有执行性的东西变成普通文本输出
变量|safe
返回字符、列表、元组、字典的元素个数:length、
变量|length
变量不存在返回默认值default,
变量|default:'默认值'
未验证:日期date
date(变量):"Y年m月j日  H时i分s秒"

模板继承

公用模板-templates/publicxxx.html

多个模板中某些内容相同,把这段内容定义到公用模板中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock title %}</title>
</head>
<body>
{% block header %}
#顶部
{% endblock header %}

{% block main %}
#主体
{% endblock main %}

{% block footer %}
#尾部
{% endblock footer %}
</body>
</html>
子模板-templates/xxx.html
#继承公用模板
{% extends 'publicxxx.html' %}
#重写block
{% block title %}
#title
{% endblock title %}
{% block main %}
#主体
{% endblock main %}

使用自带用户认证系统

View视图,数据操作

创建新的用户:create_user() 方法

#导入模块
from meiduo_mall.apps.users.models import User
from django.db import DatabaseError

try:
	User.objects.create_user(username=username, password=password, mobile=mobile)
except DatabaseError:
	return render(request, 'register.html', {'register_errmsg': '注册失败'})
	
login()状态保持:登入用户,实现状态保持
login(request, user)

喜欢的亲可以关注点赞评论哦!以后每天都会更新的哦!本文为小编原创文章; 文章中用到的文件、安装包等可以加小编联系方式获得;
欢迎来交流小编联系方式VX:CXKLittleBrother 进入运维交流群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

含义小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值