一、上下文管理器

context_processors 执行顺序是 先执行views.py中代码,在views返回之前在走到TEMPLATES.OPTIONS.context_processors的方法中

1.1、在应用./user下新增context_process.py文件

from . import models
# 上下文管理器
def title_process(request):
return {'title':'童玲的博客'} def category_process(request):
categories = models.Category.objects.all()
return {'categories':categories} def tag_process(request):
tag_list = ['python','django','自动化测试']
return {'tag_list':tag_list}

1.2、在工程的sky/settings.py下添加如下代码:

   'user.context_process.category_process',
'user.context_process.tag_process',
'user.context_process.title_process'

整个settings.py的代码为:

"""
Django settings for sky project. Generated by 'django-admin startproject' using Django 3.2.6. For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/ For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
import os
from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-&9dmdfb5o_3ckyzo$s)b(-b37%x!f3l3jb7n+ukji5)$avh216' # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True ALLOWED_HOSTS = ['*'] #配置允许哪些ip访问的 *允许所有的 # Application definition INSTALLED_APPS = [
'simpleui',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user',
'order'
] #app注册 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',
] #中间件 ROOT_URLCONF = 'sky.urls' TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')], # 这里设置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',
'user.context_process.category_process',
'user.context_process.tag_process',
'user.context_process.title_process'
],
},
},
] # 设置模板的 前后端不分离的时候它有用
# context_processors 执行顺序是 先执行views.py中代码,在views返回之前在走到TEMPLATES.OPTIONS.context_processors的方法中 WSGI_APPLICATION = 'sky.wsgi.application' # Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR,'db.sqlite3'),
}
} #配置数据库的地方 默认是sqlite3 # Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
] # Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/ LANGUAGE_CODE = 'zh-Hans' # 设置语言,'en-us':英文,'zh-Hans':中文 TIME_ZONE = 'Asia/Shanghai' # 设置时区,'UTC':标准时区 格林威治时间,'Asia/Shanghai':亚洲上海时区 USE_I18N = True USE_L10N = True USE_TZ = False # 设置是否使用标准时区时间,我们设置为False 不适用标准时区 # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/ STATIC_URL = '/static/' # 设置静态文件目录
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
) # Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

二、后端和html交互、重定向例子

2.1 编写前端表单代码:

样式:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <form action="/add" method="post">
{% csrf_token %}
<div>title: <input name = "title"></div>
<div>content: <input name = "content"></div> <select name="category_id">
{% for category in categories %}
<option value="{{ category.id }}">{{ category.name }}</option>
{% endfor %} </select>
<button type="submit">提交</button>
</form> </body>
</html>

{% csrf_token %} 为可以保存django后端返回的csrf token值 或者注释掉:settings.py中MIDDLEWARE[

'django.middleware.csrf.CsrfViewMiddleware'

]

settings.py代码:

"""
Django settings for sky project. Generated by 'django-admin startproject' using Django 3.2.6. For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/ For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
import os
from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-&9dmdfb5o_3ckyzo$s)b(-b37%x!f3l3jb7n+ukji5)$avh216' # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True ALLOWED_HOSTS = ['*'] #配置允许哪些ip访问的 *允许所有的 # Application definition INSTALLED_APPS = [
'simpleui',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user',
'order'
] #app注册 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',
] #中间件 ROOT_URLCONF = 'sky.urls' TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')], # 这里设置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',
'user.context_process.category_process',
'user.context_process.tag_process',
'user.context_process.title_process'
],
},
},
] # 设置模板的 前后端不分离的时候它有用
# context_processors 执行顺序是 先执行views.py中代码,在views返回之前在走到TEMPLATES.OPTIONS.context_processors的方法中 WSGI_APPLICATION = 'sky.wsgi.application' # Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR,'db.sqlite3'),
}
} #配置数据库的地方 默认是sqlite3 # Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
] # Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/ LANGUAGE_CODE = 'zh-Hans' # 设置语言,'en-us':英文,'zh-Hans':中文 TIME_ZONE = 'Asia/Shanghai' # 设置时区,'UTC':标准时区 格林威治时间,'Asia/Shanghai':亚洲上海时区 USE_I18N = True USE_L10N = True USE_TZ = False # 设置是否使用标准时区时间,我们设置为False 不适用标准时区 # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/ STATIC_URL = '/static/' # 设置静态文件目录
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
) # Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

前端add_article.html代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <form action="/add" method="post">
{# {% csrf_token %}#}
<div>title: <input name = "title"></div>
<div>content: <input name = "content"></div> <select name="category_id">
{% for category in categories %}
<option value="{{ category.id }}">{{ category.name }}</option>
{% endfor %} </select>
<button type="submit">提交</button>
</form> </body>
</html>

2.2 编写后端代码

views.py中添加视图函数:

from django.http import JsonResponse, HttpResponseRedirect
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import get_object_or_404
from django.core.paginator import Paginator
def add_article(request):
if request.method.upper() == 'GET':
return render(request,'add_article.html')
title = request.POST.get('title')
content = request.POST.get('content')
category_id = request.POST.get('category_id')
models.Article.objects.create(title=title,content=content,category_id=category_id)
return HttpResponseRedirect('/')

2.3 urls.py注册路由

from django.contrib import admin
from django.urls import path
from user import views urlpatterns = [
path('add',views.add_article)
]

三、ORM

/sky/user/models_test.py

import os,django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings')
django.setup() from user import models
from django.db.models import Q """
新增
"""
# 新增
models.Category.objects.create(name = 'Oracle') c = models.Category(name='RabbitMQ')
c.save() # 有外键的情况下 插入数据
models.Article.objects.create(title='orm学习',
content='orm学习,content'
,read_count=1,
category_id=1) # 指定外键 category = models.Category.objects.get(id =2) models.Article.objects.create(title='orm学习',
content='orm学习,content'
,read_count=1,
category_id=category.id) # 指定外键 models.Article.objects.create(title='orm学习',
content='orm学习,content'
,read_count=1,
category = category) # 指定外键
"""
修改
"""
# 修改
# update user set name = 'tongling';
# update user set sex = 1 where age >19; c = models.Category.objects.get(id = 1)
c.name = 'java'
c.save() # 修改单条数据 models.Category.objects.all().update(name ='abc') # 修改全表数据的某个字段 # 按照过滤条件修改一批数据的 某些字段值
models.Category.objects.filter(name='abc').update(name='cc',age=13)
"""
删除
"""
c = models.Category.objects.get(id = 1)
c.delete() # 删除一条数据 # 删除全表数据
models.Category.objects.all().delete() # 按照过滤条件删除一批数据
models.Category.objects.filter(id<5).delete() """
复杂的查询
"""
# 大于 小于 大于等于 in not 小于等于 或 print(models.Article.objects.filter(read_count__gt=0)) # 大于
print(models.Article.objects.filter(read_count__gte=0)) # 大于等于
print(models.Article.objects.filter(read_count__lt=0)) # 小于
print(models.Article.objects.filter(read_count__lte=0)) # 小于等于
print(models.Article.objects.exclude(read_count=0)) # read_count != 0
print(models.Article.objects.filter(id__in=[1,2,3])) # 在[1,2,3]中
print(models.Article.objects.filter(id=1).first()) # 查询出多条 取第一条
print(models.Article.objects.filter(title__contains='orm')) # like包含某个字符串的查询方式
print(models.Article.objects.filter(title__icontains='ORM')) # 忽略大小写 包含某个字符串的查询方式
print(models.Article.objects.filter(title__startswith='xxx')) # 以xx开头的查询条件 """
get()和 filter().first()的用法的比较,一般优先使用filter().first()
""" models.Article.objects.get(id=1) # 如果id不存在,查询无数据 则此条语句会报错 需要try expection ,可以考虑使用filter().first()代替 query_set = models.Article.objects.filter(id=80)
if query_set:
article = query_set.first() # 第一条
query_set.last() # 最后一条
else:
print('这条数据不存在') # read_count()>0 或者 title中包含orm的条件 query_set = models.Article.objects.filter( Q(read_count__gt=0) | Q(title__contains='orm'))
print(query_set) print(models.Article.objects.filter(read_count__isnull=True)) #判断是否为null
print(models.Article.objects.filter(title ='')) # 判断是否为空字符串

四、分页

/sky/user/views.py 添加视图函数

 1 def index(request):
2 articles = models.Article.objects.all()
3 page_num = request.GET.get('page',1)
4 limit = request.GET.get('limit',5)
5 page = Paginator(articles,limit) # 分页后的对象
6 articles = page.page(page_num) # 当前页的数据
7
8 # print(articles.has_next()) # 有没有下一页 有返回True 否则False
9 # print(articles.next_page_number()) # 获取下一页的页码,如果没有下一页 则会报错
10 # print(articles.has_other_pages()) # 有没有其他页,有则True,否则False
11 # print(articles.has_previous()) # 有没有上一页,有则True, 否则False
12 # print(articles.previous_page_number()) # 获取上一页的页码
13 # print(articles.number) # 获取当前页的页码
14 # print(articles.start_index()) # 当前页第一条数据的下标
15 # print(articles.end_index()) # 当前页最后一条数据的下标
16 # articles.paginator # 分页后的对象 相当于page
17 # print(page.num_pages) # 总共多少页
18 # print(page.page_range) # 分页的范围 1 2 3 4 5 ....

/sky/templates/index.html

 1     <div class="text-center mt-2 mt-sm-1 mt-md-0 mb-3 f-16">
2 {% if articles.has_previous %}
3 <a class="text-success" href="?page={{ articles.previous_page_number }}">上一页</a>
4 {% else %}
5 <span class="text-secondary" title="当前页已经是首页">上一页</span>
6 {% endif %}
7
8 <span class="mx-2">第 {{ articles.number }}&nbsp;/&nbsp;{{ articles.paginator.num_pages }}&nbsp;页</span>
9 {% if articles.has_next %}
10 <a class="text-success" href="?page={{ articles.next_page_number }}">下一页</a>
11 {% else %}
12 <a class="text-secondary" title="当前页已经是最后一页">下一页</a>
13 {% endif %}
14
15 </div>

效果图:

Django基础篇 07-Django后端和html交互的更多相关文章

  1. 01: Django基础篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  2. iOS系列 基础篇 07 Action动作和输出口

    iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...

  3. day 70 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  4. day 69 Django基础五之django模型层(一)单表操作

    Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...

  5. day 57 Django基础五之django模型层之关联管理器

    Django基础五之django模型层之关联管理器   class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况 ...

  6. day 56 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  7. day 55 Django基础五之django模型层(一)单表操作

      Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它 ...

  8. 01:django基础篇

    Django其他篇 目录: 1.1 django初探 1.2 第一个django项目 1.3 django render/redirect/HttpResponse 和 request.GET req ...

  9. Web框架django基础篇

    基本配置及学习  路由(Urls).视图(Views).模板(Template).Model(ORM). 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开 ...

  10. python的django基础篇

    一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...

随机推荐

  1. U盘启动安装 Centos 出错记录(Reached target Basic System)

    背景 在实体机上使用U盘安装CentOS7.0操作系统,U盘刻成引导盘,BIOS调成U盘启动,选择Install CentOS 7,系统安装卡在Reached target Basic System界 ...

  2. linux 上使用pm2启动nodejs服务

    1.安装pm2: npm install -g pm2 2.在启动文件夹内新建文件processes.json: {   "apps": [     {       "n ...

  3. python图片转base64、base64转图片

    #图片转base64 import base64 with open("./1.png","rb") as f:#转为二进制格式 base64_data = b ...

  4. 第一个WCF程序(最小实现)

    环境:Microsoft Visual Studio 2017 注意事项:右键"以管理员身份"启动VS. 目标:实现一个加法运算,并在服务器端D盘新建一个文件夹. 一.服务器端创建 ...

  5. 【阿里云ACP】-01(阿里云综述、弹性计算)

    课程能力 课程范围 ECS 磁盘 实例 磁盘 快照 镜像 网络 安全组 AS 伸缩组 伸缩配置 伸缩规则 伸缩活动 伸缩触发任务 伸缩模式 冷却时间 SLB 定义 实现原理 支持的协议 绘画保持 健康 ...

  6. mac Big Sur 打开应用提示,您没有权限来打开应用程序

    终端输入codesign --force --deep --sign - /Applications/{AppName.app}注意{AppName.app} 替换为无法打开的应用程序名,将尝试强制签 ...

  7. mysql8 更改root密码(windows)

    1.停止服务 net stop mysql; 2.控制台输入 mysqld --console --shared-memory --skip-grant-tables 3.重新打开一个窗口,进入bin ...

  8. db2入门必看命令清单--日常运维必需

    关注 推荐 嘉兴 视频 财经 科技 热点 国际 更多   搜索 34 消息 发布     5   2   收藏 分享 db2入门必看命令清单--日常运维必需 https://www.toutiao.c ...

  9. 运用python中装饰器方法来解决工作中为原有代码添加功能问题

          Python  装饰器 在实际的工作中,经常碰到领导或产品经理会提出很多甚至(变态)的产品要求,作为python开发,好不容易完成领导的需求,做出一个产品,并且经过测试成功上线.突然有一天 ...

  10. 原创:USB HID读卡器数据解析(R321-13.56MHZ读卡器)

    1.工具准备 USB 监视软件:Device Monitoring Studio7.25 PC端软件:单片机多功能调试助手 2.发送数据包 接收数据包 3.数据分析 usb hid(pc软件)发送帧( ...