文章目录
一、Django介绍
1. Django历史
Django是由美国的一个web开发团队编写。它诞生于2003年秋天,当时他们的 web 小组制作并维护当地的几个新闻站点, 并在以新闻界特有的快节奏开发环境中逐渐发展。 这些站点包括有 LJWorld.com、Lawrence.com 和 KUsports.com, 记者(或管理层) 要求增加的特征或整个程序都能在计划时间内快速的被建立,这些时间通常只有几天 或几个小时。因此,只能开发一个节省时间的web开发框架,这样才能完成任务。一段时间后,那个框架已经足够驱动世界上最大的在线开发网站了。2005年夏天,团对决定把框架作为开源软件发布出来。他们在2005年7月发布并命名为Django。
2. Django特性
- 优点
(1)重量级的框架,提供了丰富的功能组件,让开发变得简单便捷
(2)完善的开发文档,提供给开发人员很好的解决方案。
(3)开发效率快 - 缺点
(1)开发不够灵活,不够自由,不能完成高度定制化的开发。
(2)执行速度慢
二、Django安装
1. Django安装
- 版本号
推荐使用2.2.1版本 - 为什么使用这个版本
不使用最新的版本(不稳定)
选择使用稳定的版本
LTS长版本支持 - Django安装
创建虚拟环境:conda create D_37 python=3.7
激活虚拟环境:activate D_37
安装Django:pip install django==2.2.1
(使用国内源)上一步后加 -i http://pypi.tuna.tsinghua.edu.cn/simple
安装测试
(D_37) C:\Users\dell>python
Python 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)] ::
Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(2, 2, 1, 'final', 0)
>>>
2. 创建项目
- 创建工程
首先创建一个目录
进入目录,发开终端(命令行)
激活虚拟环境
创建工程django-admin startproject Demo(工程名称)
F:\0831Pro\DjPro>activate D_37
(D_37) F:\0831Pro\DjPro>django-admin startproject Qshop
- Django项目启动
使用pycharm打开文件目录
启动项目
(D_37) F:\0831Pro\DjPro>cd Qshop
(D_37) F:\0831Pro\DjPro\Qshop>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced)
修改监听的ip和端口
(D_37) F:\0831Pro\DjPro\Qshop>python manage.py runserver 0.0.0.0:80
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
也可以使用pycharm运行,修改参数如下
3. 目录结构
三、第一个项目hello world
Django当中,会把视图和路由都单独放到文件当中
通常视图放在views文件当中
路由放在urls文件当中
Django 视图函数:
1、必须定义一个参数,来接受request。
2、必须返回的是一个response对象,不可以直接返回字符串
Django路由:
1、必须在一个叫做urlpatterns的列表
2、路由时通过path和re_path来定义,第一个参数时路由规则,第二个参数时路由指向的视图函数(这个函数需要提前从视图当中导入)
代码如下:
视图文件views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("hello world")
路由文件 urls.py
from django.contrib import admin
from django.urls import path
from Qshop.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', index)
]
四、Django路由
Django和其他的web框架一样,都可以使用路由进行传参,但是Django路由传参使用的正则的组匹配进行的。
在django 1.8版本之前路由方法叫做url,1.8之后叫做path,2.0之后path被分为path和re_path,其中:
path负责常规的字符型的路由
re_path负责正则类型的路由
但是注意:
- urlpatterens是一个列表,列表有序,如果第一个路由匹配成功,之后不再匹配,所以编写路由需要注意覆盖问题
- 在路由规则当中,存在,且允许多个不同路由指向同一个视图
urlpatterns = [
re_path(r".*",hello),
path('hhh/', hello),
re_path(r"\d/",hello)
]
- 路由大概在,使用正则的组匹配匹配的内容会作为参数传递个视图函数,并且视图函数需要定义参数接受。
- 为了匹配的稳定和可读性,建议使用命名组
- 使用允许多个不同路由指向同一个视图的特性完成视图函数默认值参数的功能
五、Django模板系统
jinjia2模板仿制Django的模板系统。
模板设置
-
模板配置
-
模板加载
from django.shortcuts import render_to_response #加载指定目录下的HTML文件
def index(request):
return render_to_response("index.html")
- 数据渲染
所谓数据渲染就是将视图当中的数据传递给页面上,然后按照前端的样式去展示数据, - 数据传递
相较于flask,Django向HTML传递数据需要的是一个字典类型的参数,而不是字典类型的参数组,所以有下列写法
# Flask
def fun():
return render_template("index.html",**locals())
# Django
def fun(request):
return render_to_response("index.html",locals())
from django.shortcuts import render_to_response
def index(request):
string = "hello world"
return render_to_response("index.html",{"string":string})
# 或者
return render_to_response("index.html",locals())
模板语法
Django自带模板渲染的规则,分为变量、标签、过滤器。
1. 变量
语法:{{ 变量名 }}
相较于Flask,Django模板变量不可以调用含有参数的方法,其他的都可以通过.来调用,比如:索引,方法都是可以的。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ string.upper }}
{{ string.1 }}
</body>
</html>
2. 标签
语法:{% %}
- {% if %}
{% if name == "vip" %}
欢迎尊贵球球五彩钻用户上线:{{ name }}
{% elif name %}
欢迎上线:{{ name }}
{% else %}
欢迎注册或登陆平台
{% endif %}
- {% ifequal %} 判断两个是属性是否相等
{% ifequal name vip %}
他是VIP
{% endifequal %}
- {% for %}循环
{% for p in person %}
{{ p }}<br>
{% endfor %}
- forloop
django模板系统内置的用来控制循环的变量,常和if一起使用
{% for p in person %}
{{ forloop }}<br>
{% endfor %}
{% for p in person %}
{% if forloop.first %}
<p style="color: red;">{{ p }}</p>
{% else %}
<p>{{ p }}</p>
{% endif %}
{% endfor %}
- {% autoescape %}
off关闭自动转义,on开启自动转义 类似safe,但是safe可以修改的是一个变 量,而autoescape修改一段代码
{% autoescape off %}
{{ scripts }}
{% endautoescape %}
3. 过滤器
django的模板变量不可以调用带参数的方法,所以过滤器变得很重要,更多需要开发者自定义过滤器
作用:将试图传的值进行二次处理
语法:{{ name|过滤器的方法:传值 }}
|过滤器,将左边语句的值作为参数传递到后边的语句
Django自带过滤器方法:
过滤器 | 作用 | 用法 |
---|---|---|
upper | 大写 | {{ user_name丨upper }} |
lower | 小写 | {{ user_name丨lower }} |
safe | 执行原本代码 | {{ user_name丨safe}} |
静态文件处理
Django的静态配置进行了更加严谨的设置一共五条配置:
- STATIC_URL:指在HTML页面上的静态文件路径
- STATICFILES_DIRS: 指静态文件的存放位置
- STATIC_ROOT
- MEDIA_URL
- MEDIA_ROOT
在网页上STATIC_URL可以代表STATICFILES_DIRS目录并且名称可以不一样。
# settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,"static")
]
模板继承与包含
1. 继承 {% extends %}
当我们浏览一个网站的时候发现里面的网页大部分是相同的。这时候我们为了去除代码的冗余,可以使用继承
(1)定义父模板,在父模板中定义block,定义的父模板如未调用,自动加载默认部分
{% block main %}
默认部分
{% endblock %}
(2)定义子模板,继承父模板,根据需要实现父模板中的block
{% block main %}
<p>我是主体部分</p>
{% endblock %}
注意:
extends必须写在第一行
子模版只能加载block内容,写在block之外的HTML不识别
2. 包含 {% include %}
可以将常用的页面内容比如导航条,页尾信息等不变的组件保存在单独的文件中,然后再需要的地方按如下语法导入即可:
{% include 'navbar.html' %}