Python 小试牛刀,Django详细解读,让你更快的掌握它!!!
一、MVC和MTV模式
MVC:将web应用分为模型(M),控制器(C),视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。
模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求。
Django的MTV模型本质上与MVC没有什么差别,也是各组件之间为了保持松耦合关系,只不过定义上有些不同,Django的MTV分别是:
• Model(模型):负责业务对象与数据库的对象(ORM)
• Template(模板):负责如何把页面展示给用户
• View(视图):负责业务逻辑,并在适当的时候调用Model和Template
二 Django的流程和命令行工具
命令行创建
文件介绍:
• manage.py --- Django项目里面的工具,通过它可以调用django shell和数据库等
• settings.py --- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
• urls.py --- 负责把url模式映射到应用程序
- 生成同步数据库的脚本:python manage.py makemigrations
同步数据库:python manage.py migrate
注:开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个粗暴方法是将migrations目录下的脚本(除了__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。
-- 访问http://127.0.0.1:8000/admin/login/?next=/admin/时,需要为进入这个项目后台创建超级管理员:python manage.py createsuperuser,设置好账户密码就可以登陆
-- 清空数据库:python manage.py flush
-- 查询某个命令的详细信息:django-admin.py help startapp
-- 启动交互界面:python manage.py shell(和直接运行python进入shell的区别是:你可以在这个shell里面调用当前项目的models.py中的API,对于操作数据,还有一些小测试非常方便)
-- 终端上输入python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用
提交数据并展示
提交数据并展示(数据库)
三 Django URL(路由系统)
URL配置(URLconf)就像Django所支持网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
1 urlpatterns = [
2 url(正则表达式,views视图函数,参数,别名),
3 ]
示例
四 Django Views(视图函数)
Http请求中产生两个核心对象:
http请求:HttpRequest对象
http响应:HttpResponse对象
HttpResponse对象的属性和方法
注:常用request.POST.getlist('')
对于HttpReques对象来说,是由django自动创建的。但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。
HttpResponse类在django.http.HttpResponse
1 HttpResponse对象上扩展的常用方法:
2
3 页面渲染: render() render_to_response()
4 页面跳转: redirect("路径")
5 locals():可以直接将函数中所有的变量传给模板
五 Template基础
模板语法
• 模板的组成
1 HTML代码+逻辑控制代码
• 逻辑控制代码的组成
1、变量(使用双大括号来引用变量)
1 格式: {{ var_name }}
---------Template和Context对象
Django模板解析非常便捷。大部分的解析工作都是在后台通过对简短正则表达式一次性调用来完成。相比于XML的模板引擎形成鲜明对比,那些引擎承担了XML解析器的开销,且往往比Django模板渲染引擎要慢的多。
推荐
---------深度变量的查找(万能的句点号)
以上的例子中,通过context传递的简单参数值主要是字符串,然而,模板系统能够非常简洁地处理更加复杂的数据结构,如:list、dictionary和自定义的对象。
Django模板中遍历复杂数据结构的关键是句点字符(.)。
View Code
---------变量的过滤器(filter)的使用
1 格式: {{obj|filter:param}}
View Code
2、标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)
1 {%tags%}
---------{% if %} 的使用
{% if %}标签计算一个变量值,如果是"true",即它不存在、不为空并且不是false的boolean值,系统则会显示{% if %}和{% endif %}间的所有内容
View Code
---------{% for %} 的使用
{% for %}标签允许你按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有哦内容
View Code
---------{% csrf_token%}:csrf_token标签
用于生成csrf_token的标签,用于防治跨站攻击验证。注:若在view的index里用的是render_to_response方法,不会生效
这里生成一个input标签,和其他表单标签一起提交给 后台
---------{% url %}:引用路由配置的地址
View Code
---------{% with %}:用更简单的变量名替代复杂的变量名
1 {% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
---------{% verbatim%}:禁止render
1 {% verbatim %}
2 {{ hello }}
3 {% endverbatim %}
---------{% load%}:加载标签库
3、自定义filter和simple_tag
a.在app中创建templatetags模块(必须的)
b.创建任意.py文件,如:my_tags.py
View Code
c.在使用自定义simple_tag和filter的html文件中导入之间创建的 my_tags.py:{% load my_tags.py %}
d.使用simple_tag和filter
View Code
e.在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
View Code
注:filter可以用在if等语句后,simple_tag不可以
4、extend模板继承
---------include 模板标签
{% include %}:该标签允许在(模块中)包含其它的模板的内容。标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。每当在多个模板中出现相同的代码时,就应该考虑是否要使用{% include %}来减少重复。
---------extend(继承)模板标签
在实际应用中,将用Django模板系统来创建整个HTML页面。这就带来一个常见Web开发问题:在整个网站中,如何减少共用页面区域(如站点导航)所引起的重复和冗余代码?
解决该问题的传统做法是使用 服务器端的includes,可以在HTML页面中使用该制定将一个网页嵌入到另一个中。事实上,Django通过上面的{% include %}支持这种方式。但是用Django解决此类问题的首选方法是使用更加优雅的策略----模板继承。
本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模版中对它所包含站点公用部分和定义块进行重载。
第一步:定义基础模板,该框架将由子模板所继承
View Code
以上定义了一个简单的HTML框架文档,将在本站点的所有页面中使用。子模板的作用就是重载、添加或保留那些块的内容。
所有的{% block %}标签告诉模板引擎,子模板可以重载这些部分。每个{% block %}标签所要做的是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖。
View Code
View Code
这样一来,每个模板只包含对自己而言独一无二的代码。无需多余的部分。如果想进行站点级的设计修改,仅需修改基础模板即可,所有其他模板都会被修改。
六 Models
数据库配置
1、django默认支持sqlite,mysql,oracle,postgresql数据库。
a.sqlite
django默认使用sqlite的数据库,默认自带sqlite的数据库驱动,引擎名称:django.db.backends.sqlite3
b.mysql
引擎名称:django.db.backends.mysql
2、mysql驱动程序
a.MySQLdb(mysql python)
b.mysqlclient
c.MySQL
d.PyMySQL(纯python的mysql驱动程序)
3、在django的项目中会默认使用sqlite数据库,在settings有如下配置:
复制代码
1 DATABASES = {
2
3 'default': {
4
5 'ENGINE': 'django.db.backends.mysql',
6
7 'NAME': 'books', #你的数据库名称
8
9 'USER': 'root', #你的数据库用户名
10
11 'PASSWORD': '', #你的数据库密码
12
13 'HOST': '', #你的数据库主机,留空默认为localhost
14
15 'PORT': '3306', #你的数据库端口
16
17 }
18
19 }
复制代码
注意!!!
ORM(对象关系映射)
用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作。
优点:
1、ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发,由此而来的。
2、可以避免一些新手程序员写SQL语句带来的性能问题。
缺点:
1、性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载等来减轻这个问题。
2、对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。
3、通过QuerySet的query属性查询对应操作的sql语句。
1 author_obj=models.Author.objects.filter(id=2)
2 print(author_obj.query)
模型常用的字段类型参数
Field重要参数
表单的添加--> views.py
表单的修改-->views.py
表单的删除-->views.py
表单的查询-->查询API
表单的查询-->补充
View Code
QuerySet的特性
聚合查询和分组查询aggregate(args,*kwargs)
F查询和Q查询
创建表
在settings加上日志记录
注:若创建表失败,请看:https://www.cnblogs.com/chenyanbin/p/10628646.html
七 admin的配置
admin是Django强大功能之一,它能从数据库中读取数据,呈现在页面中,进行管理。默认情况下,它的功能已经非常强大,如果你不需要复杂的功能,它已经够用了,但是有时候,一些特殊的功能还需要定制,比如搜索功能。
修改页面字
注册medel类到admin的两种方式
创建Django账号
登陆admin
操作admin
一些常用的设置技巧
• list_display:指定要显示的字段
• search_fields:指定搜索的字段
• list_filter:指定列表过滤器
• ordering:指定排序字段
复制代码
1 from django.contrib import admin
2 from app01.models import *
3 # Register your models here.
4
5 # @admin.register(Book)#----->单给某个表加一个定制
6 class MyAdmin(admin.ModelAdmin):
7 list_display = ("title","price","publisher")
8 search_fields = ("title","publisher")
9 list_filter = ("publisher",)
10 ordering = ("price",)
11 fieldsets =[
12 (None, {'fields': ['title']}),
13 ('price information', {'fields': ['price',"publisher"], 'classes': ['collapse']}),
14 ]
15
16 admin.site.register(Book,MyAdmin)
17 admin.site.register(Publish)
18 admin.site.register(Author)
复制代码