django--主要部分
django URL
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调
用这段代码,对于那个URL调用那段代码。
在url.py中的只有一个元组,需要添加URL时只要卸载元组里面就成。
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^cur_time',views.current_time),
url(r'^user_info',views.user_info),
url(r'^article/(?P<year>[0-9]{4})/(?P<month>[0-9] {2})/$',views.yeartest),
url(r'^login$',views.login,name="denglu"),
url(r'^home$',views.home)
]
参数说明:
- 一个正则表达式字符串
- 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 可选的要传递给视图函数的默认参数(字典形式)
- 一个可选的name参数
需要注意的是:utl映射是有顺序的并且只会匹配一次
url(r'^article/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.yeartest)
1 其中?P是正则中分组并命名的关键字,外边又加上了括号,所以会传送给yeartest这个函数两个参数。
2 url(r'^user_info',views.user_info,{"name":"alex"}), 相当于默认参数
3 url(r'^user_info',views.user_info,name="alex") url 的别名 form中的action中用模板语言代替 为{% url alex %},这样做的目的是防止后端改变影响到前端。
4 使用include:在文件的英语解释中写的很详细:
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
之后再在自己的app中建立一个urls的py文件。其中内容一致不过,url再有blog开头的会顺位到另一个文件中匹配。
Django Views
通过例子看知识点:
def login(request):
if request.method=="POST":
username = request.POST.get("username")
pwd = request.POST.get("pwd")
if username == "ccc"and pwd == "":
return redirect("/home") # 返回一个home页面 执行home函数的
return render(request,"login.html") #
涉及到的知识点:
- render和Httpresponse要import过来。
- render内部也是通过Httpresponse传送渲染好HTML给浏览器。
- request是django自动传过来的参数必须要接收,可以是自定义。
- .menthod是表单发送的形式。大写post。
- post是一个字典,可以遍历。使用get方法更好。
- redirect是返回到这个URL(没用render),不是返回到这个函数或者HTML。若是返回到函数home或者直接homeHTML会导致home的一些数据没加载。并且页面还 是留在login页面,刷新后又得登录了。
- render后面的第一个参数必须是request,第二个是HTML,在后是参数。有时候为有local.()表示将所有的本地变量制成字典传送给HTML。涉及到模板语言。
request中的其他属性:
# path: 请求页面的全路径,不包括域名
#
# method: 请求中使用的HTTP方法的字符串表示。全大写表示。例如
#
# if req.method=="GET":
#
# do_something()
#
# elseif req.method=="POST":
#
# do_something_else()
#
# GET: 包含所有HTTP GET参数的类字典对象
#
# POST: 包含所有HTTP POST参数的类字典对象
#
# 服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
# HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
# if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method=="POST"
#
#
#
# COOKIES: 包含所有cookies的标准Python字典对象;keys和values都是字符串。
#
# FILES: 包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
#
# filename: 上传文件名,用字符串表示
# content_type: 上传文件的Content Type
# content: 上传文件的原始内容
#
#
# user: 是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
# 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
# 可以通过user的is_authenticated()方法来辨别用户是否登陆:
# if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
# 时该属性才可用
#
# session: 唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。 #方法
get_full_path(), 比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123
req.path:/index33
Template基础
尽管在视图中函数中可以直接returnHTML代码,但是出于效率,美观,分工,和维护等缘故一般讲写好的HTML页面以HTML后缀保存在template中。称为模板。
模板的组成
HTML代码和逻辑控制代码。
模板语言
前端网页要根据每个用户不同的信息产生不同的页面,所以尽管有js让页面动起来也需要从后端将数据传送到网页上。
{{ name }}
>>> python manange.py shell
>>> from django.template import Context, Template
>>> t = Template('My name is {{ name }}.')
>>> c = Context({'name': 'Stephane'})
>>> t.render(c)
'My name is Stephane.'
上述代码是在manage shell命令中执行的渲染过程。这一过程搬运到HTML中就实现了页面数据的交换。这也是上节中render最后一个参数的传入的原因。
万能的点(.)
如果想其中传送的是以一个字典,那么可以通过点来检索这个字典。
>>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': ''}
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
'Sally is 43 years old.'
同理,列表,元组,对象的属性,方法等都可以通过点来找到。
变量的过滤器filter和 tag
{{obj|filter:param}}
其他的方法:
# 1 add : 给变量加上相应的值
#
# 2 addslashes : 给变量中的引号前加上斜线
#
# 3 capfirst : 首字母大写
#
# 4 cut : 从字符串中移除指定的字符
#
# 5 date : 格式化日期字符串
#
# 6 default : 如果值是False,就替换成设置的默认值,否则就是用本来的值
#
# 7 default_if_none: 如果值是None,就替换成设置的默认值,否则就使用本来的值
{% tags %}
tag是标签的意思,与filter不同它中间是百分号。并且中间一般是特殊的语句。
if语句
{% if num >= 100 and 8 %} {% if num > 200 %}
<p>num大于200</p>
{% else %}
<p>num大于100小于200</p>
{% endif %} {% elif num < 100%}
<p>num小于100</p> {% else %}
<p>num等于100</p> {% endif %} {% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量
{% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的: {% if obj1 and obj2 or obj3 %}
if
for语句
{% if num >= 100 and 8 %} {% if num > 200 %}
<p>num大于200</p>
{% else %}
<p>num大于100小于200</p>
{% endif %} {% elif num < 100%}
<p>num小于100</p> {% else %}
<p>num等于100</p> {% endif %} {% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量
{% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的: {% if obj1 and obj2 or obj3 %}
for
{%csrf_token%}:csrf_token标签
这个标签会写在input后面,即form表单中最后。作用是防止跨站攻击验证,会随机生成一个复杂的字符串和表单的数据一起送过去。
在使用render_to_response的时候没有作用。
{% url %}
<form action="{% url "bieming"%}" >
<input type="text">
<input type="submit"value="提交">
{%csrf_token%}
</form>
在URL参数中提到,是配合name用的。
{% with %}:用更简单的变量名替代复杂的变量名
1
|
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %} |
{% verbatim %}: 禁止render
1
2
3
|
{% verbatim %} {{ hello }} {% endverbatim %} |
自定义的filter和tag(需要重启)
1.在app中创建templatetags模板,名字不能变。
2.创建自己的tag的py文件。文件内容:
from django import template
from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变 @register.filter
def filter_multi(v1,v2):
return v1 * v2 @register.simple_tag
def simple_tag_multi(v1,v2):
return v1 * v2 @register.simple_tag
def my_input(id,arg):
result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
return mark_safe(result)
3.使用之前在HTML文件开头引入:{% load my_tags %}
4.像其他filter和tag一样调用即可。需要注意的是filter是过滤器只能有两个参数。用法是在filter后面紧跟:和变量
extend继承
在整个项目的实际运行中会有像标题等相同模块,不能每次用户点一次页面就让程序员再写一次。此时用到的就是extend继承标签。
说白了,将多个页面大致内容一致时,将其中相同的那部分写到一个base.html钟,其他的页面用到这部分时继承过来用就行。
所以在一些文件中出现了如下的语句:
{% extends "base.html" %} {% block title %}The current time{% endblock %} {% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}
extend表示其他的内容继承来自base,但是在base中的block title中的信息要替换成为这个block中,同理 content。
django--主要部分的更多相关文章
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- django server之间通过remote user 相互调用
首先,场景是这样的:存在两个django web应用,并且两个应用存在一定的联系.某些情况下彼此需要获取对方的数据. 但是我们的应用肯经都会有对应的鉴权机制.不会让人家随随便便就访问的对吧.好比上车要 ...
- Mysql事务探索及其在Django中的实践(二)
继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...
- Mysql事务探索及其在Django中的实践(一)
前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...
- 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...
- Django
一.Django 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) ...
- Django admin定制化,User字段扩展[原创]
前言 参考上篇博文,我们利用了OneToOneField的方式使用了django自带的user,http://www.cnblogs.com/caseast/p/5909248.html , 但这么用 ...
随机推荐
- .NET Attributes
Attributes 特性 公共语言运行时允许添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microso ...
- href使用 javascript:;与javascript:void(0)防跳到顶部
有时候我们在编写js过程中,需要触发事件而不需要返回值,那么就可能需要这样的写法 href=”#”,包含了一个位置信息.默认的锚是#top,也就是网页的上端,当连续快速点击此链接时会导致浏览器巨慢 ...
- iOS开发多线程篇 — GCD的常见用法
一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil ...
- ajax表单提交
HTML代码: <form id="formCity" action="/SiteMap/Search" method="get" o ...
- SpringBoot实战配置
http://blog.csdn.net/sun_t89/article/details/51944252 http://www.cnblogs.com/kreo/p/4423362.html
- Spring中文文档-第一部分
一. Spring 框架概述 Spring是为了构建企业应用的轻量级框架.然而,Spring是模块化的,允许你只是使用其中的一部分,不需要引入其他的.你可以在任何web框架上使用IoC容器,也可以只使 ...
- JVM相关
内存栅栏 1 what 说白了是一些cpu或编译器的一些同步指令 2 why cpu的cache快,而不去内存中取数据,在多线程并发中会读到cache的数据. 3 how 一般直接用关键字viloti ...
- RAC出现CRS-4535: Cannot communicate with Cluster Ready Services 时排查问题步骤
crsctl check crs 发现第二行报错: CRS-4638: Oracle High Availability Services is onlineCRS-4535: Cannot comm ...
- Go语言 数组
介绍 Array 是值类型,Slice 和 Map 是引用类型.他们是有很大区别的,尤其是在参数传递的时候. 另外,Slice 和 Map 的变量 仅仅声明是不行的,必须还要分配空间(也就是初始化,i ...
- 本机tomcat的server.xml被还原的问题及解决办法
将tomcat的server.xml进行修改,但当eclipse发布站点后,发布tomcat中的server.xml会被还原. 原因是eclipse会将自己的tomcat配置文件对tomcat覆盖,解 ...