Django-基础-1
Django 的学习 https://www.cnblogs.com/yuanchenqi/articles/8875659.html https://www.cnblogs.com/yuanchenqi/articles/7629939.html http://www.cnblogs.com/haiyan123/p/7701412.html MTV 模型 M model (负责业务对象和数据库的关系映射)(orm) T template (存放html,负责把页面展示给用户) V view (视图,负责业务逻辑,在适当的时候调用model和template) Django 有一个URL控制器(路径和函数关系的映射,pattern),根据URL pattern 来分发给不同的view函数处理,view调用相应的model和template 返回页面给用户 一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。 django 的安装 pip3 install django(目前最新版本是2.0) 我们上课的时候用的是1.x版本,所以这里我也装1.11版本的 pip3 install django==1.11 django 是下载在python3 解释器的lib 目录下面了 下载完成后会看到我们的scripts 多了django-admin.exe django-admin.py 使用django-admin.py startproject myproject 创建项目 使用cd myproject && python3 manage.py startapp app01 创建应用 我们使用命令行或者是pycharm 创建一个项目,项目名是Myproject,然后我们再创建一个应用的名字app01 创建完成之后的目录结构是这样的 myproject-------------------------->这个是项目名,可以更改 app01-------------------------->项目应用的名称,我们要是有多个应用这里我们还可以有app02,app03 migrations __init__.py admin.py models.py tests.py views.py myproject----------------------->这个名字不可更改,这里的配置是应用于全局配置的 __init__.py settings.py----------------->存放项目的配置文件 urls.py--------------------->路径和视图函数的映射关系,看urlpatterns字典,当应用很多的时候,我们应该在每个应用里面创建一个urls.py wsgi.py--------------------->和socket相关 templates----------------------->存放各种html文件,css,js 会放在新的static文件夹 manage.py----------------------->与Django项目进行交互的脚本,启动的时候我们执行python manage.py runnserver IP PORT,默认8000端口 这里我们分不同的应用是为了解耦 url 匹配规则自上而下。上面匹配上了,不再往下匹配 HttpResponse :封装响应体的类,返回任何数据,都应该放在HttpResponse里返回 这里举例我们的url 路径是timer 那么就会匹配上这一条规则 url(r'^timer/', views.timer),就去执行 视图函数中的timer(形参xxx)函数,传入一个request 实参,request 包含所有的请求信息,当我们请求的时候 Django中的wsgi把所有的请求信息封装成request对象,封装好之后立马传给timer,timer 函数要是利用任何一个 request 的任意一个对象信息的时候直接从request对象里取就可以了 render : render(request, template_name[, context]) 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。 按照settings配置指定的路径找到html 文件 参数: request: 用于生成响应的请求对象。 template_name:要使用的模板的完整名称,可选的参数,这里我们直接templates目录下的html文件名即可,因为在setting.py 中 TEMPLATES 列表配置了templates的环境变量,'DIRS': [os.path.join(BASE_DIR,'templates')] context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。 content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。 status:响应的状态码。默认为200。 render 其实最终也是调用的HttpResponse ctime = str(time.time()) name = 'bigbao' age = '18' return render(request,"time.html",{'ctime':ctime,'name':name,'age':age}) 这里的“ctime” key 是html模板中要引用的,ctime是上面函数取到的 模板语法: 目的是将变量(数据库的内容)如何巧妙的嵌入到html页面中(就不用之前我们用的字符串拼接了) 在 Django 模板中遍历复杂数据结构的关键是句点字符,语法: {{var_name}} render 方法有两个功能: 返回一个页面 模板语法:将变量巧妙的嵌入html页面中 return HttpResponse("访问成功") 返回的一定是一个字符串,如果想返回纯字符串,就用HttpResponse方法 我们在post数据的时候我们可以再request.POST 对象里面取到我们提交的数据 比如说我们在form表单里提交了我们input里定义的两个input元素名称 user_name 和 pwd,那么我们就可以再request.post.get('user_name') 和request.post.get('pwd') 取到相应的值 URL控制器 url组成部分: 协议://ip(域名):端口/路径?参数 url的功能: url路径和视图函数的映射关系 1、一旦匹配成功则不再继续 2、若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), # 无名分组: url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive) 给函数传入两个实参 # 有名分组(就是给分组起个名字,这样定义的好处就是按照关键字参数去传参了,指名道姓的方式)语法:(?P<name>pattern) url(r'^article/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month_hasname),这样函数year_month_hasname里会有两个形参的名字是year和moth和位置无关 URL 分发: 这里我们应该解耦,我们可以把每个URL pattern 放在自己的应用下面,在我们自己的应用下面创建一个urls.py文件 全局配置的urls.py 需要配置如下 from django.conf.urls import url,include url(r'^app01/', include('app01.urls')) 也就是说访问路径以app01 开头的路径都到app01 下面的的urls去匹配规则 URL 反射:我们把我们的url路径加上一个别名,然后直接调用别名路径,这样我们以后修改URL路径的时候别名不改,改动就小了,不然的话改动太大 url(r'^login/',name=xxxxx),这样我们以后修改url 的时候,这里我们以后修改路径的时候我们直接修改成如下: url(r'^login.hhhtml/',name=xxxxx) 反向解析 这样我们在模板语法中标签怎么调用这个变量呢, <form action="{% url 'xxxxx' %}" method="post"> 我们就会跳到login.hhhtml/页面了,我们不需要修改其他的东西 这里我们去找别名是 xxxxx 的URL,然后我们找到的是 login.hhhtml ,然后把login.hhhtml/ 放到action里面,把{% url 'xxxxx' %} 换成 login.hhhtml/ 视图函数 1 request 对象 request.GET request.POST request.method request.path request.get_full_path() 2 HttpResponse Django 必须相应HttpResponse 对象 HttpResponse 用来相应字符串 render 用来响应模板 redirect 重定向 from django.shortcuts import render,HttpResponse,redirect 比如说我们登录成功之后给我们重定向到首页 return redirect('/index/') 模板语法 http://www.cnblogs.com/haiyan123/p/7725568.html 变量渲染{{ }} 深度查询: 说到底就是利用句点符来操作 传入列表的时候,我们html 中变量引用的时候用{{ list.3 }} 传入字典的时候,html 模板语法中用 {{ dict.key }} 过滤器: 语法: {{obj|filter__name:param}} default 过滤器: date 过滤器:{{ value|date:"Y-m-d" }} length 过滤器:{{ value|length }} filesizeformat 过滤器:{{ value|filesizeformat }} slice 过滤器:{{ value|slice:"2:-1" }} truncatechars 过滤器:{{ content|truncatechars:20 }} 标签渲染{ %% } for 循环标签 我么可以用到{{ forloop.counter }} 来添加数字,需在for循环内用,我们要是循环字典我们可以利用dict.items <ul> {% for book in book_list %} <li>{{ book }}</li> {% endfor %} </ul> if 标签 {% for foo in score %} {% if foo > 100 %} <p> {{ foo }}</p> {% endif %} {% endfor %} 静态文件的引入: # 别名,以后实际用的时候用的是这个别名,STATICFILES_DIRS 是Django用的,STATICFILES_DIRS 和 STATIC_URL 必须都存在,结合使用的 # 我们在用STATIC_URL别名的时候,Django 会自己去找到他的实际路径,我们在html应用静态文件的时候必须用别名,比如 # <script src="/static/jquery.js"></script> 这个就是我静态文件应用的格式 # 下面这个两个是在setting.py 文件里面配置的 STATIC_URL = '/static/' # 文件的实际存在目录,必须叫STATICFILES_DIRS STATICFILES_DIRS=[os.path.join(BASE_DIR,"static")] 模板的继承 我们写一个继承模板base.html 继承模板里的 {% block content %} 继承模板的内容 {% endblock content %} 然后我们在我们的子模板里,首行加上{% extends 'base.html' %} 然后在html 文件中写入 {% block content %} 自己的独特内容,这种情况下会覆盖父模板的内容,我么可以加上{{ block.super }},父模板的内容在子模板也出现 {% endblock content %} ORM http://www.cnblogs.com/yuanchenqi/articles/8933283.html 有几个问题: 1、python3 我们用的数据库链接用的是pymysql,所以这里我们在全局的__init__.py 文件或者是工程的__init__.py 文件加上如下两句话 import pymysql pymysql.install_as_MySQLdb() 2、然后把配置文件setting.py 中的DATABASES 的sqlite3 换成mysql DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'orm',# 要连接的数据库,连接前需要创建好 'USER':'root',# 连接数据库的用户名 'PASSWORD':'abcd1234',# 连接数据库的密码 'HOST':'10.10.20.17',# 连接主机,默认本级 'PORT': 3306 # 端口 默认3306 } } 3、models.py 中 创建 表的类 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) state = models.BooleanField() pub_date = models.DateField() price = models.DecimalField(max_digits=8, decimal_places=2) publish = models.CharField(max_length=32) 4、初始化数据库 python manage.py makemigrations (这一步就报错了) python manage.py migrate 在执行初始化数据库的时候遇到 No changes detected 然后按照网上的方法,python manage.py makemigrations app01 ,同时在setting.py 里的INSTALLED_APPS添加一行'app01' 然后再去删除相应的缓存,再执行 python manage.py makemigrations app01 python manage.py migrate