一.需要弄清楚的几个关键点:
KEY:
1 Django项目无论多大,只是一个应用程序
2 地址栏发请求默认是GET请求
form表单可以发送get请求,也可以发送post请求
3 浏览器接受的响应体是字符串,由浏览器解释渲染成页面给用户看
4 form表单的提交按钮事件:
给action对应的服务器发送请求
''
GET /auth/?数据user=yuan&pwd=123 ....
......
......
空行
请求体 # user=yuan&pwd=123
''
5 新的响应会覆盖之前请求的响应页面 二.Django路由
响应体:render 和 redirect 都基于HttpResponse
1.HttpResponse
HttpResponse("字符串") 或 HttpResponse("<a>click</a>") 2.render
goods_list = ["手机","电脑"]
dic ={"name":alex,"age":12}
视图函数中格式
return render(request,"index.html",{"goods":goods_list,"dic":dic})
return render(request,local()),local()表示:拿到当前视图函数中的变量
html文件中: {{goods}} key:
1.找文件,读文件
2.渲染数据,解析
3.把最终渲染的字符串交给HttpResponse返回 3.redirect (重定向)
访问一个网站跳到另一个网址; 场景:一般在登录成功之后跳转到首页
1.重定向,涉及到两份请求 2.需要到项目中的配置文件settings文件中,注释掉,或在for表单中加上一句:{% csrf_token %}
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware', #setthings中注释掉这句话
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
] 3.views视图函数中,重定向的格式
重定向,发生了两次请求。第一次,用户验证成功后,(登录成功才重定向)
服务器给浏览器回一个状态码(302)和一个响应头location:path(从定向路径),
让浏览器在次发请求去访问redirect中的地址path
return redirect("/index/") 4.redirect
1.为什么用户登录成功后,不直接用render(request,"index.html"),直接访问首页,而是通过重定向,让客户再次发请求访问首页。
两者的区别直接用render(request,"index.html"),会丢失数据,就是没有传参数3数据部分;如何重定向去首页,走的是
render(request,"index.html",{"goods":goods,.....}) 所以两者是有很大的区别的。一般redirect是用在当需要跳转到另一个页面时用。 路由分组:
无名分组
(\d{4}) 在urls分组之后,可以获取分组后的值,分组后的值必须传给view函数做参数
如:url(r"^articles/(\d{2})/(\d{2})",views.get_num) get.get_num(request,12,12)
有名分组
(?P<y>\d{4})
<y> 尖括号里面自命名为y
在urls分组之后,可以获取分组后的值,分组后的值是以键值方式传给视图函数做为关键字参数
如:url("^articles/(?P<y>\d{4})/(?P<m>\d{2})$",views.get_year_month)#相当于关键字传参 get_year_month(request,y=2002,m=12) 路由分发:
1.总urls中:
url("app1/",include("app1.urls")),
url("app2/",include("app2.urls")), 2.app1或app2中创建urls
3.用户访问时,需要地址栏需要先 ip:端口/app1/...
  例子:
    
    from django.urls import path,re_path,include
    from app01 import views     urlpatterns = [
  re_path(r'^admin/', admin.site.urls),
  re_path(r'^blog/', include('blog.urls')),
    ]

    模板
1 渲染变量: {{}}
1.深度查询 2.过滤器
{{ val|filter_name:参数 }}
{{value|default:"nothing"}} //当数据为空时,默认值
{{value|length}} 返回长度,对字符串和列表起作用
{{value|filesizeformat}} 格式化文件大小,人类可读 date
var value = datatime.datetime.now()
{{value|date:"Y-m-d"}} slice 切片
value ="hello world"
{{value|slice:"2:-1"}}
truncatechars
{{value|truncatechars:9}} //按字节截取
{{value|truncatewords:9}} //截取单词 safe 不需要转义
value ='<a href="">点击</a>'
{{value|safe}} 2 渲染标签 {% %} 1.for 标签
{%for item in li%}
<p>{{item}}{</p>
{% endfor%} {% for book in li %}
<p>{{ forloop.counter}} {{ book.name }} {{forloop.first}}</p> forloop.counter 计数 forloop.first/last判断是否为第一次或最后一次循环
# <p>{{ forloop.counter0}}=>{{ book.name }}</p> 从0开始计数
#<p>{{ forloop.revcounter}} ,{{ book.name }}</p> forloop.revcounter 反过来计数
{% endfor %} <tbody>
{% for book in books %}
<tr>
<td>{{ book.id}}</td>
<td>{{ book.name }}</td>
<td>{{ book.author }}</td>
<td>{{ book.price }}</td>
</tr>
{% endfor %}
</tbody> {% for person in person_list %}
<p>{{ person.name }}</p> {% empty %}
<p>sorry,no person here</p>
{% endfor %} 2. {% if num > 100 %}
<p>{{num}}</p>
{% else %}
<p>{{10}}</p>
{% endif %} 3. with 给比较长的变量另取别名 {% with b_name=book.0.name %}
<p> {{b_name}}</p>
{% endwith %} 4. csrf_token 标签
{% csrf_token %} 当被render() 解析为一个input的标签,里面有一个键值,带着这个键值对去服务器,为了安全 3 自定义过滤器和标签:
自定义过滤器:最少一个参数,最多两个参数
1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1.apps.App1Config',
] 2、在app中创建templatetags模块(模块名只能是templatetags) 3、创建任意 .py 文件,如:customer_filter_tag.py
from django import template
register = template.Library() #register的名字是固定的,不可改变 #自定义筛选器
@register.filter
def multi_filter(x,y):
return x*y #自定义标签
@register.simple_tag
def multi_tag(x,y,z):
return x * y * z 4.在html 文件中,用时用{% load 自定义标签文件名 %}
如:
{% load customer_filter_tag %}
<p>{{ num|multi_filter:2 }}</p>
<p>{% multi_tag 4 7 2 %}</p>
<p>{% multi_tag num 7 4 %}</p> 4 继承 1.母版: base.html文件中:con这个区域的名字,占位个位置,留个子html
{% block con %}
<p> 母版钩子中留的内容,子html可以通过 {{block.super}} </p>
{% endblock %} 2.子html:
页面第一行 {% extends "base.html" %}
内容:
{% block con %}
{{ block.super }} #引用母板钩子中留有的内容,表示不全覆盖
{% endblock %} 反向解析:
防止硬编码,把东西写死了,
python 脚本中,重定向的时候,可能会把url写死,
redirect("/index/") 改为 from django.urls import reverse _url =reverse("index")括号中对应的是别名, return redirect(_url)
服务端:urls文件中: url(r"^login/$",views.login,name="login"), 别名为login 浏览器端:
form表单 action = “{% url "别名" %}”
别名反向解析到最新的url


												

52 53django的更多相关文章

  1. com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0

    这是由于JDK版本不一致造成的,指的是高版本的JDK编译的class不能放在低版本的JDK上运行. Version 52,表示JDK8编译的class不能运行在JDK7上,所以需要在本地安装JDK8.

  2. 52. 不用+、-、×、÷做加法[add two numbers without arithmetic]

    [本文链接] http://www.cnblogs.com/hellogiser/p/add-two-numbers-without-arithmetic.html [题目] 写一个函数,求两个整数的 ...

  3. NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解多少钱?

    NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解 芯片解密型号: P87C51x2.P87C52x2.P87C54x2.P87C58x2.P87C591  单片机解密 #####[ ...

  4. Java 用LinkdeList实现52张扑克牌

    用LinkdeList实现52张扑克牌(不含大小王)的洗牌功能.提示:花色 ,和数字分别用数组存储. import java.util.LinkedList; import java.util.Ran ...

  5. Unsupported major.minor version 52.0问题的解决

    下载Tomcat9.0,解压后安装运行,结果启动失败,进入logs文件夹看里面的日志文件,提示是Unsupported major.minor version 52.0错误,这是因为Tomcat版本过 ...

  6. CH Round #52 还教室[线段树 方差]

    还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...

  7. effective OC2.0 52阅读笔记(七 系统框架)

    47 熟悉系统框架 总结:将代码封装为动态库,并提供接口的头文件,就是框架.平时的三方应用都用静态库(因为iOS应用程序不允许在其中包含动态库),并不是真正的框架,然而也经常视为框架.例如:NSLin ...

  8. Android studio 出现 Unsupported major.minor version 52.0

    参考资料:http://blog.csdn.net/fakine/article/details/51241202 最近更新了Android studio 之后,出现了Error:java.lang. ...

  9. Total Commander 8.52 Beta 1

    Total Commander 8.52 Beta 1http://www.ghisler.com/852_b1.php 10.08.15 Release Total Commander 8.52 b ...

随机推荐

  1. 【转】svn http://提示svn: Unrecognized URL scheme错误

    转自:http://blog.csdn.net/l241002209/article/details/8547943 SVN这个东西虽然不好用(当然也是因为自身没有重视,但是谁让GIT这么好用呢…!) ...

  2. [转载]C#异步调用四大方法详解

    C#异步调用四大方法是什么呢?C#异步调用四大方法的使用是如何进行的呢?让我们首先了解下什么时候用到C#异步调用: .NET Framework 允许您C#异步调用任何方法.定义与您需要调用的方法具有 ...

  3. MySQL数据库----IDE工具介绍及数据备份

    一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 二.MySQL数据备份 # ...

  4. 短网址(short URL)系统的原理及其实现

    短网址(short URL)系统的原理及其实现 https://hufangyun.com/2017/short-url/?hmsr=toutiao.io&utm_medium=toutiao ...

  5. phpstudy升级mysql版本到5.7 ,重启mysql不启动

    phpstudy中mysql升级后MySQL服务无法启动 问题产生: 安装好phpstudy后,升级了MySQL后,通过phpstudy启动,Apache可以启动,Mysql无法启动. 解决方法: 之 ...

  6. Django 搭建后台 favicon.ico 文件操作

    Django 搭建后台 favicon.ico 文件操作 使用 django 搭建后台服务器,我用的是 django 1.8 版本以上的,就是路由不是 url 而是 path 的,这里有一个关于fav ...

  7. nw.exe开发DEMO下载

    参考的原文链接:http://www.jianshu.com/p/7c66ee28ce51 最后,开发者怕你怀疑nw.js的强大,又提供了几个Demo和许多成功的案例来打消我们的顾虑.

  8. (GO_GTD_3)基于OpenCV和QT,建立Android图像处理程序

    一.解决权限问题     图片采集了,处理了,如何保存?最直接的方法是使用imwrite,但是如果现在直接使用的话,比如会出现这样或那样的错误,因为我们现在是在android的环境下进行图像处理,所以 ...

  9. 三步搞定 opencv 初始环境设定

    一.设定bin的初始位置:比如我的电脑 D:\安装程序\opencv\build\x86\vc10\bin      H:\生产力工具\opencv\build\x86\vc10\bin D:\安装程 ...

  10. BZOJ 2434 阿狸的打字机(fail树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2434 题意:阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28 ...