主要文件

manage.py      创建服务器

settings.py    项目的配置信息

urls.py         URL分发器(URLconf----URL和函数的映射表)

view.py         视图(函数)

manage.py

启动manage.py创建简单的服务器,用于调测

python manage.py runserver 0.0.0.0:8000

urls.py

patterns:第一个是空字符串(后面会解释)

include:

urls

from django.conf.urls.defaults import patterns, include, url
from mysite.views import hello      # 通常是导*  views. 调用
urlpatterns = patterns('',url(r'^hello/$', hello),)

如果有人申请访问/hello(尾部没有斜杠/)会怎样。 因为我们的URL模式要求尾部有一个斜杠(/),那个申请URL将不匹配。 然而,默认地,任何不匹配或尾部没有斜杠(/)的申请URL,将被重定向至尾部包含斜杠的相同字眼的URL。 (这是受配置文件setting中APPEND_SLASH项控制的

 url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),

这三个括号里的内容会以第二第三第四的参数传给 函数,第一参是request

view.py

一个视图就是Python的一个函数。这个函数第一个参数的类型是HttpRequest;它返回一个HttpResponse实例。

request 是一个触发这个视图、包含当前Web请求信息的对象,是类django.http.HttpRequest的一个实例。

from django.http import HttpResponse
def hello(request):return HttpResponse("Hello world")    # 直接返回字符串
---------------------------------------------------------------------
from django.shortcuts import render
def be_001(request):return render(request,'001.html')    # 返回template文件下的001.html

settings.py

设置指定URLconf  (url分发器)

ROOT_URLCONF = 'mysite.urls'     # 即mysite/urls.py
  1. 进来的请求转入/hello/.

  1. Django通过在ROOT_URLCONF配置来决定根URLconf.

  1. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。

  1. 如果找到匹配,将调用相应的视图函数,并把HttpRequest 对象作为第一个参数

  1. 视图函数返回一个HttpResponse

  1. Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来

指定模板路径

TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),# 自动获取settings.py的路径,并拼接得到模板路径
)
# 单元素元组中必须使用逗号,以此消除与圆括号表达式之间的歧义。



模板

在project目录 (django-admin.py startproject)中  输入命令 python manage.py shell启动交互界面(会自动加载相关配置)

循环判断

{% for item in item_list %}     # 表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的, forloop.counter0从零开始

<p>` forloop`.`counter `: ` item `</p>  # forloop.revcounter 是表示循环中剩余项的整型变量,forloop.revcounter0

{% endfor %}  #forloop.first 是一个布尔值,如果该迭代是第一次执行,那么它被置为true,forloop.last

#  forloop.parentloop 是一个指向当前循环的上一级循环的 forloop 对象的引用(在嵌套循环的情况下)

{% if ordered_warranty %} # 只能用一种逻辑操作符 and 或 or ,两个一起用不可以的

{% else %}

{% endif %}

{% ifequal user currentuser %}# 判断 user currentuser 是否相等,字符串要“”,只能判断两个变量是否相等<h1>Welcome</h1># 不能用于判断变量是否等于什么,True {op:123} [1,2,3]等等{% endifequal %}

变量赋值

{{ person_name }}   称为 变量(variable) 。这意味着在此处插入指定变量的值。

>>> from django import template                # Template 可用render方法传 Context 参数
>>> t = template.Template('My name is {{ name }}.')
>>> c = template.Context({'name': 'Adrian'})
>>> print t.render(c)
My name is Adrian.
>>> c = template.Context({'name': 'Fred'})
>>> print t.render(c)                    # 返回的是Unicode r''
My name is Fred.

Django模板系统的基本规则: 写模板,创建 Template 对象,创建 Context , 调用 render() 方法。

>>> from django.template import Template, Context
>>> import datetime
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
u'Sally is 43 years old.'
>>> d = datetime.date(1993, 5, 2)        #时间也可以这么用
>>> d.year
1993
>>> t = Template('Item 2 is {{ items.2 }}.')            # 列表索引(不能用负数)
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})#调用方法时并没有使用圆括号 而且也无法给该方法传递参数;
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')    # var变量,调用upper和isdigit方法
>>> t.render(Context({'var': 'hello'}))
u'hello -- HELLO -- False'
  • 字典类型查找 (比如 foo["bar"] )

  • 属性查找 (比如 foo.bar )

  • 方法调用 (比如 foo.bar() )

  • 列表类型索引查找 (比如 foo[bar] )

系统使用找到的第一个有效类型。 这是一种短路逻辑。

一个变量不存在,模板系统会把它展示为空字符串,不做任何事情来表示失败。

方法调用

抛异常

在方法查找过程中,如果某方法抛出一个异常的话它将被传播(报错)。

若该异常有一个 silent_variable_failure 属性并且值为True ,模板里的指定变量会被置为空字符串(不报错)

模版中避免关键函数的误操作

def delete(self):

# Delete the account

delete.alters_data = True

# 把delete看成一个对象,设置它的alters_data属性。这样在渲染的时候,就会变成failed silent。不会执行

注释

单行

{# This is a comment #}

多行

{% comment %}
This is a
multi-line comment.
{% endcomment %}

过滤器

常用的几个

模板过滤器是在变量被显示前修改它的值的一个简单方法。

{{ my_list|first|upper }}
{{ bio|truncatewords:"30" }}

addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。 这在处理包含JavaScript的文本时是非常有用的。

date : 按指定的格式字符串参数格式化 date 或者 datetime 对象, 范例:

{{ pub_date|date:"F j, Y" }}

格式参数的定义在附录F中。

length : 返回变量的长度。 对于列表,这个参数将返回列表元素的个数。 对于字符串,这个参数将返回字符串中字符的个数。 你可以对列表或者字符串,或者任何知道怎么测定长度的Python 对象使用这个方法(也就是说,有 __len__() 方法的对象)

详细 https://www.douban.com/note/145065606/

模板加载

settings.py

import os.pathTEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)

在视图中

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetimedef current_datetime(request):now = datetime.datetime.now()t = get_template('current_datetime.html')html = t.render(Context({'current_date': now}))return HttpResponse(html)

更为简洁的视图

from django.shortcuts import render_to_response
import datetimedef current_datetime(request):now = datetime.datetime.now()return render_to_response('current_datetime.html', {'current_date': now})# 返回HttpResponse 对象;# 第一个参数必须是要使用的模板名称;# 第二个参数,那么该参数必须是为该模板创建 Context 时所使用的字典,默认是空字典

locals() 技巧

def current_datetime(request):now = datetime.datetime.now()        # 多余的变量名...return render_to_response('current_datetime.html', {'current_date': now})
def current_datetime(request):       current_date = datetime.datetime.now()        # 这个变量名和模板中的一致return render_to_response('current_datetime.html', locals())# locals()囊括了函数执行到该时间点时所定义的一切变量。

get_template()-模板子目录

t = get_template('dateapp/current_datetime.html')
return render_to_response('dateapp/current_datetime.html', {'current_date': now})

include 模板标签(笨笨的嵌套网页)

{% include template_name %}

如果{% include %}标签指定的模板没找到,Django将会在下面两个处理方法中选择一个:

如果 DEBUG 设置为 True ,你将会在 Django 错误信息页面看到 TemplateDoesNotExist 异常。

如果 DEBUG 设置为 False ,该标签不会引发错误信息,在标签位置不显示任何东西。

模板继承(更加优雅的策略)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">        # base.html
<html lang="en">
<head><title>{% block title %}{% endblock %}</title>
</head>
<body><h1>My helpful timestamp site</h1>
</body>
</html
{% extends "base.html" %}                        # 继承模板,替换同名block即可{% block title %}The current time{% endblock %}{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}

要点:

基础模板中的 {% block %} 标签越多越好。

子模板不必定义父模板中所有的代码块。

不允许在同一个模板中定义多个同名的 {% block %} 。




模型

为了提供方便的数据访问API, Django需要以 某种方式 知道数据库层内部信息,有两种实现方式。

第一种方式是用Python明确地定义数据模型

第二种方式是通过自省来自动侦测识别数据模型。

(自省(运行时自动识别数据库)会导致过载和有数据完整性问题。)

笨方法数据库查询

from django.shortcuts import render_to_response        # 重复同样的代码
import MySQLdb                                         # 绑定死了MySQL def book_list(request):db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')cursor = db.cursor()cursor.execute('SELECT name FROM books ORDER BY name')names = [row[0] for row in cursor.fetchall()]db.close()return render_to_response('book_list.html', {'names': names})

Django数据库层

from django.shortcuts import render_to_response        # 由Django数据库层来处理
from mysite.books.models import Book                   # 底层数据库代码更为优化,数据库选择更灵活
def book_list(request):books = Book.objects.order_by('name')return render_to_response('book_list.html', {'books': books})

settings.py 中数据库的设置

DATABASES = {'default': {'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.'NAME': '',                      # Or path to database file if using sqlite3.'USER': '',                      # Not used with sqlite3.'PASSWORD': '',                  # Not used with sqlite3.'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.'PORT': '',                      # Set to empty string for default. Not used with sqlite3.}}

MVC 模式

控制器(controller) ---->>>   模型(model) ---->>>   视图(view)

MTV

" C 由框架自行处理(URLconf)"   ---->>>   模型(Model)---->>> 视图(Views)---->>> 模板(Template)

APP

理一理project和app:一个project包含多个app,为app提供相关配置,但model必须在各自的app中

python manage.py startapp books    # 创建APP

在models.py中描述数据库

from django.db import modelsclass Publisher(models.Model):name = models.CharField(max_length=30)address = models.CharField(max_length=50)city = models.CharField(max_length=60)state_province = models.CharField(max_length=30)country = models.CharField(max_length=50)website = models.URLField()class Author(models.Model):first_name = models.CharField(max_length=30)last_name = models.CharField(max_length=40)email = models.EmailField()class Book(models.Model):title = models.CharField(max_length=100)authors = models.ManyToManyField(Author)publisher = models.ForeignKey(Publisher)publication_date = models.DateField()

与下面的sql效果一样

CREATE TABLE "books_publisher" ("id" serial NOT NULL PRIMARY KEY,"name" varchar(30) NOT NULL,"address" varchar(50) NOT NULL,"city" varchar(60) NOT NULL,"state_province" varchar(30) NOT NULL,"country" varchar(50) NOT NULL,"website" varchar(200) NOT NULL
);

settings.py 激活app

MIDDLEWARE_CLASSES = (                                        # 注释部分后续解释# 'django.middleware.common.CommonMiddleware',# 'django.contrib.sessions.middleware.SessionMiddleware',# 'django.contrib.auth.middleware.AuthenticationMiddleware',
)INSTALLED_APPS = (# 'django.contrib.auth',# 'django.contrib.contenttypes',# 'django.contrib.sessions',# 'django.contrib.sites','mysite.books',
)

检查上面模型的语法和逻辑(正常返 0 erros found)

python manage.py validate

生成 CREATE TABLE 语句

python manage.py sqlall books

提交到数据库客户端执行

python manage.py syncdb        # 此命令不能用做修改删除

基本数据访问

python manage.py shell

>>> from books.models import Publisher            # 导入Publisher模型类,与数据表进行交互
>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
...     city='Berkeley', state_province='CA', country='U.S.A.',
...     website='http://www.apress.com/')
>>> p1.save()
>>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.',
...     city='Cambridge', state_province='MA', country='U.S.A.',
...     website='http://www.oreilly.com/')
>>> p2.save()
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Publisher object>, <Publisher: Publisher object>]

下面不需要save,直接完成对象的创建与存储至数据库

>>> p1 = Publisher.objects.create(name='Apress',
...     address='2855 Telegraph Avenue',
...     city='Berkeley', state_province='CA', country='U.S.A.',
...     website='http://www.apress.com/')

重写__unicode__,方便

class Author(models.Model):**def __unicode__(self):**        # __unicode__() 方法可以进行任何处理来返回对一个对象的字符串表示**return u'%s %s' % (self.first_name, self.last_name)**    # 必须返回Unicode,数字什么的会报错

插入更新

>>> p = Publisher(name='Apress',
...         address='2855 Telegraph Ave.',
...         city='Berkeley',
...         state_province='CA',
...         country='U.S.A.',
...         website='http://www.apress.com/')
>>> p.save()        #相当于执行INSERT INTO books_publisher***  会把主键赋值给实例对象 p
>>> p.id
52    # this will differ based on your own data
>>> p.name = 'Apress Publishing'        # 根据这个对象可更新数据
>>> p.save()                            # 并不是只更新修改过的那个字段,所有的字段都会被更新。# 部分更新后面再说

查询

>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]

数据过滤(filter--返回列表)

>>> Publisher.objects.filter(country="U.S.A.", state_province="CA")
[<Publisher: Apress>]多个参数会被转换成 AND SQL从句, 因此上面的代码可以转化成这样:
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE country = 'U.S.A.'
AND state_province = 'CA';
>>> Publisher.objects.filter(name__contains="press")    # 在 name 和 contains 之间有双下划线
[<Publisher: Apress>]                                   # 这里,contains部分会被Django翻译成LIKE语句:注意,SQL缺省的 = 操作符是精确匹配的, 其他类型的查找也可以使用
WHERE name LIKE '%press%';

获取单个对象

>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>MultipleObjectsReturned  # 结果是多个对象,抛出异常
DoesNotExist   #  DoesNotExist 异常 是 Publisher 这个 model 类的一个属性,即 Publisher.DoesNotExist。在你的应用中,你可以捕获并处理这个异常

数据排序

>>> Publisher.objects.order_by("-state_province", "address")[<Publisher: Apress>, <Publisher: O'Reilly>]# 减号 - 前缀逆向排序,第二个字段会在第一个字段的值相同的情况下被使用到
class Publisher(models.Model):**class Meta:****ordering = ['name']**# 在模型类(需要设置默认排序的)中,设置默认的排序方式,上述当你使用 Django 的数据库 API 去检索时,# Publisher对象的相关返回值默认地都会按 name 字段排序

连锁查询

>>> Publisher.objects.filter(country="U.S.A.").order_by("-name")
[<Publisher: O'Reilly>, <Publisher: Apress>]
# 即为SQL查询 WHERE 和 ORDER BY 的组合

限制返回数据

>>> Publisher.objects.order_by('name')[0:2]        # 即为OFFSET 0 LIMIT 2;
>>> Publisher.objects.order_by('-name')[0]        # 不能用负索引,但可以这样变通

更新

>>> p = Publisher.objects.get(name='Apress')
>>> p.name = 'Apress Publishing'
>>> p.save()                    # 这样操作会更新所有的列(不仅仅是name列的值)

指定更新

>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')    # id=52的表的name字段
>>> Publisher.objects.all().update(country='USA')        # 所有Publisher的country字段值
2            # update()方法会返回一个整型数值,表示受影响的记录条数。

删除对象

>>> p = Publisher.objects.get(name="O'Reilly")    # 删除指定记录
>>> p.delete()
>>> Publisher.objects.filter(country='USA').delete()    # 同时删除多条记录
>>> Publisher.objects.all().delete()

多对多用两个循环获取 .all 获取所有(列表)  .first 获取首个

<img src="`i`.`p_w_picpath`.`all`.`0`.`p_w_picpath`.`url`" alt="`i`.`title`"/>
{% for im in i.p_w_picpath.all %}<img src="`im`.`p_w_picpath`.`url`" alt="`im`.`name`"/>{% endfor %}

转载于:https://blog.51cto.com/woodcutter/1829390

python_Django之模板模型相关推荐

  1. 架构设计之三种业务模型:活动资源模型、契约模型、模板模型

    欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析.实际应用.架构思维.职场分享.产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习 1 文章概述 在实际 ...

  2. 疫情排查节时86%?不会代码也能玩转模型训练?腾讯大神揭秘语音语义及AutoML黑科技 | 内含福利...

    出品 | AI科技大本营(ID:rgznai100) 2020年7月3日,AI ProCon 2020 AI开发者万人大会,隆重举行!作为CSDN策划并主办的系列技术「开发者大会」之一,本次大会通过线 ...

  3. 斯坦福-随机图模型-week2.1_

    title: 斯坦福-随机图模型-week2.1 tags: note notebook: 6- 英文课程-9-Probabilistic Graphical Models 1: Representa ...

  4. 你必须懂的 T4 模板:深入浅出

    示例代码:示例代码__你必须懂的T4模板:浅入深出.rar (一)什么是T4模板? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit. T4文 ...

  5. Java程序员需要了解的两种服务器设计模型

    我们在IO模型和Java网络编程模型中,对IO有了一定的理解.这一篇,主要讲解基于事件驱动的两种是在原来基础上的扩展.在基于事件驱动的网络编程模型中,Reactor和Proactor模型是两种常用的I ...

  6. .NET中关于T4模板的使用

    文章目录 介绍 简单说下什么是t4模版 具体使用方式 TransformText方法 自定义T4模板引擎 两种方式的比较 总结 介绍 最近工作中需要按一定的模板模型生成指定的文件,虽然可以直接拼接字符 ...

  7. freeMarker(十)——模板语言之内建函数

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.字符串内建函数 这些内建函数作用于表达式左侧的字符串值. 如果左侧 ...

  8. 模板的选择和结合部位可塑性处理对GPCRs虚拟筛选性能影响

    今天要分享的是一篇蛋白质同源建模(MODELLER同源建模)与虚拟筛选相关的文献--<Performance of virtual screening against GPCR homology ...

  9. mysql+php+模板+条目_html模板

    E服务secret相关文档资料 https://support.huaweicloud.com/api-cce/cce_02_0042.html name 否 用户创建的云容器引擎密钥的名称 参数类型 ...

最新文章

  1. 通过Http管理Solr Core,实现索引的分类
  2. 台式计算机风扇一直响,风扇一直响的原因是什么? 处理方法
  3. 从入门到熟悉 HTTPS 的 9 个问题
  4. 如何快速压测电商网站?
  5. opengl 日地月运动模型_MaskFusion: 多运动目标实时识别、跟踪和重建
  6. matlab 第i行到j行,matlab简明教程
  7. .NETCore 实现容器化Docker与私有镜像仓库管理
  8. 反射生成 INSERT 多个对象的 SQL 语句(批量插入)
  9. 李国庆深夜发“15条真相”回应:关于原生家庭、同性恋、1.3亿...
  10. git向码云上提交项目
  11. Bitmap对象保存到bmp文件中
  12. 红队笔记之内网信息搜集技术要点总结
  13. 毕设论文评审意见分类
  14. 前端学习第九弹:简易的聊天界面
  15. 如何取消满意度评价,去除满意度评价
  16. 转:在收费车棚内丢失车辆的责任承担
  17. word2pdf 批量转化word为pdf
  18. 单招计算机都有哪些专业,单招十大类分别有什么专业
  19. 深入理解Asp.net MVC路由
  20. 谷歌量子计算机_轰动全球的谷歌量子计算机

热门文章

  1. sql advantage 执行sql_Sql 的执行顺序是怎样的?
  2. 【转载】Python 深入浅出支持向量机(SVM)算法
  3. C++下简单的socket编程
  4. 手机直播系统源码搭建说明
  5. Django DTL模板语法中的循环
  6. java 基于tcp客户端服务端发送接收数据
  7. 蓝桥杯:安慰奶牛(最小生成树)
  8. 车载360度全景监视系统
  9. 深度学习——你需要了解的八大开源框架
  10. Caffe实践】如何利用Caffe训练ImageNet分类网络