sqlitedjango进阶-1

前言:
各位久等了,django进阶篇来了。

一、get与post

接口规范:
url不能够写动词,只能写名词

django默认只支持有限栽办法: get,
post

get是获取数据

?user=zcl&password=abc&email=669@qq

?号表示后面是参数,&在少参数中间

request.GET.get("password")

点立句代码可获密码abc,是开诚布公的!!

post获取密码是密文的。post请求用于创造或者修改数据。

    if request.method == 'GET':
        # <view logic>
        return HttpResponse('result')

  

次、模版渲染

而也许曾经注意到我们以例子视图中归文本的方有点特别。
也就是说,HTML被直硬编码在 Python 代码之中。

1 def current_datetime(request):
2     now = datetime.datetime.now()
3     html = "<html><body>It is now %s.</body></html>" % now
4     return HttpResponse(html)

 

尽管这种技能便利解释视图是哪行事的,但一直用HTML硬编码到你的视图里倒连无是一个好主意。
让咱们来拘禁一下为什么:

  • 本着页面设计开展的别改动都得对 Python 代码进行相应的改动。
    站点设计之改往往比较脚 Python
    代码的修改要再三得多,因此若得以以匪开展 Python
    代码修改的状下转规划,那以会见好得多。
  • Python 代码编写和 HTML
    设计是片码不同之做事,大多数规范的网站开发环境还拿她们分配为不同之人手(甚至不同机关)来成功。
    设计者和HTML/CSS的编码人员未该叫求去编辑Python的代码来好他们之做事。
  • 程序员编写
    Python代码和统筹人员做模板两桩工作以拓展的效率是最高的,远胜于被一个人数等其他一个人口成功对某既涵盖
    Python又带有 HTML 的文本的编撰工作。

冲这些由,将页面的设计与Python的代码分离开会更彻底简洁又便于保障。
我们得以用 Django的 模板系统 (Template System)来贯彻这种模式。

Django模版基本语法

1 >>> from django.template import Context, Template
2 >>> t = Template('My name is {{ name }}.')
3 >>> c = Context({'name': 'Stephane'})
4 >>> t.render(c)
5 u'My name is Stephane.'

平等模板,多独达标下文: 一旦发生矣 模板 对象,你就足以经过它渲染多只context

1 >>> from django.template import Template, Context
2 >>> t = Template('Hello, {{ name }}')
3 >>> print t.render(Context({'name': 'John'}))
4 Hello, John
5 >>> print t.render(Context({'name': 'Julie'}))
6 Hello, Julie
7 >>> print t.render(Context({'name': 'Pat'}))
8 Hello, Pat

无论是何时我们还得像这么用同样模板源渲染多单context,只进行
一赖模板创建然后反复调用render()方法渲染(render)会进一步便捷:

1 # Bad
2 for name in ('John', 'Julie', 'Pat'):
3     t = Template('Hello, {{ name }}')
4     print t.render(Context({'name': name}))
5  
6 # Good 生成模版实例是有系统开销的,一个模版实例是可以进行多次上下文的渲染
7 t = Template('Hello, {{ name }}')
8 for name in ('John', 'Julie', 'Pat'):
9     print t.render(Context({'name': name}))

留意: 如果无python manage.py shell
是碰头曝错的!!这句代码的义是导入django环境。

sqlite 1

 

老三、深度变量的搜索

每当届目前为止的例子中,我们透过 context
传递的简短参数值主要是字符串,然而,模板系统能够挺简洁地拍卖越错综复杂的数据结构,例如list、dictionary和打定义之靶子。

每当 Django
模板被遍历复杂数据结构的主要是句点字符 (.)。

通往模板传递一个 Python 字典。
要透过字典键访问该字典的值,可采用一个句点:

1 >>> from django.template import Template, Context
2 >>> person = {'name': 'Sally', 'age': '43'}
3 >>> t = Template('{{ person.name }} is {{ person.age }} years old.')
4 >>> c = Context({'person': person})
5 >>> t.render(c)
6 u'Sally is 43 years old.'

平,也足以经句点来访问对象的属性。 比方说, Python 的
datetime.date 对象来 year 、 month 和 day
几单特性,你同可于模板被行使句点来访问这些性:

 1 >>> from django.template import Template, Context
 2 >>> import datetime
 3 >>> d = datetime.date(1993, 5, 2)
 4 >>> d.year
 5 1993
 6 >>> d.month
 7 5
 8 >>> d.day
 9 2
10 >>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
11 >>> c = Context({'date': d})
12 >>> t.render(c)
13 u'The month is 5 and the year is 1993.'

句点也可用来访问列表索引,例如:

1 >>> from django.template import Template, Context
2 >>> t = Template('Item 2 is {{ items.2 }}.')
3 >>> c = Context({'items': ['apples', 'bananas', 'carrots']})
4 >>> t.render(c)
5 u'Item 2 is carrots.'

sqlite 2

 

季、隔行更换背景颜色

效果图(太牛啦):

sqlite 3

输入url通过路由调用index方法:

1 def index(request):
2     if request.method == "GET":
3         user_info = [{"username":"zcl_1","name":"zhang CL",},
4                      {"username": "zcl_2", "name": "zhang CL", },
5                      {"username": "zcl_3", "name": "zhang CL", },
6                      {"username": "zcl_4", "name": "zhang CL", },
7                      {"username": "zcl_5", "name": "zhang CL", },]
8 
9         return  render(request, "app01/index.html", {"user_objs":user_info})

app01/index.html下有些代码:

 1     <ul>
 2         {% for user_obj in user_objs %}
 3 {#            {% if forloop.counter0 > 2 %}#}
 4             {% if forloop.counter0|divisibleby:"2"  %}
 5                 <li style="background-color: darksalmon">username:{{ user_obj.username }};name:{{ user_obj.name }}</li>
 6             {% else %}
 7                 <li style="">username:{{ user_obj.username }};name:{{ user_obj.name }}</li>
 8             {% endif %}
 9         {% endfor %}
10     </ul>

注意: forloop.counter0表示循环从0开始,divisibleby:”2″表示能够叫2整治除的。PS:
千万决不写成divisibleby: ”2″(中间加个空格,会曝错的!!当时己便加了空格,出错时同脸懵比…)

 

五、模版的连续与复用

 

Templates/app01/page1.html文件:

 1 <body>
 2     {% extends "app01/index.html" %}  {#继承父模版#}
 3     <h1>page1</h1>
 4 </body>
 5 
 6 Templates/app01/index.html文件:
 7 <body>
 8     <ul>
 9         <li style="display: inline">Home</li>
10         <li style="display: inline">page1</li>
11         <li style="display: inline">page2</li>
12         <li style="display: inline">page3</li>
13     </ul>
14     <h1>welcome to payment index</h1>
15 
16     <footer>
17         <h1>foot</h1>
18     </footer>
19 </body>

Templates/app01/index.html文件:

sqlite 4sqlite 5

 1 <body>
 2     <ul>
 3         <li style="display: inline">Home</li>
 4         <li style="display: inline">page1</li>
 5         <li style="display: inline">page2</li>
 6         <li style="display: inline">page3</li>
 7     </ul>
 8     <h1>welcome to payment index</h1>
 9 
10     <footer>
11         <h1>foot</h1>
12     </footer>
13 </body>

View Code

渲染page1.html文书效果图:

sqlite 6

题材: 发现虽然可以持续父模版index.html,但是子模版page1.html之情节让掩。默认全部累父模版!!

什么缓解者问题也?
实际要求达到,比如一个网站的上菜单栏,前端界面基本是同一的,不同页面会生出微小的异。这时我怀念,我好举行一个网站的菜单栏作为父模版,该父模版可以被外页面继承(extends)或复用(include).

今自己产生个要求,我特想替换父模版index.html的 welcome to payment
index:

Templates/app01/index.html文件:用block将待给轮换的内容包含起来。

    {% block content-container %}
    <h1>welcome to payment index</h1>
    {% endblock %}

Templates/app01/page1.html文本: 用block将要替换父模版的情包含起来。

<body>
    {% extends "app01/index.html" %}
    {% block content-container %}   {# 重写父模版的content-container部分 #}
    <h1>page1</h1>
    {% endblock %}
</body>

继承功能图:

sqlite 7

 

复用就简单了,重复地利用嘛,比如自己当register.html写一个报之表单,只要网站的页面有需要登记,直接复用之前写的表单就OK了

{% include "app01/register.html" %}

Templates/app01/page1.html文件:

1 <body>
2     {% extends "app01/index.html" %}
3     {% block content-container %}
4     <h1>page1</h1>
5         {% include "app01/register.html" %}
6     {% endblock %}
7 </body>

Templates/app01/register.html:

<body>
    <div style="background-color: antiquewhite">
        <form>
            Username:<input name="username" type="text">
            Password:<input name="password" type="password">
        </form>
    </div>
</body>

接轨+复用效果图(图备受form表单是复用来之~):

sqlite 8

 

六、django orm

django 本身提供了充分强易用的ORM组件,并且支持多数据库,如sqllite,mysql,progressSql,Oracle等,当然最常用的铺垫要mysql,要启用orm,先使配备好连接数据
的信。

为更好之解,我们来开一个为主的 书籍/作者/出版商 数据库结构。
我们这样做是盖
这是一个显然的例证,很多SQL有关的书本也时时因此这个比喻。

咱们来如下面的这些概念、字段和事关:

  • 一个作者有姓,有名及email地址。

  • 出版商有号,地址,所在城市、省,国家,网站。

  • 书有书名和出版日期。
    它有一个或者多个作者(书与作者是大半针对多之涉嫌关系[many-to-many]),
    只出一个出版商(书以及出版商是平针对性多的关系关系[one-to-many],也深受称之为外键[foreign
    key])

 

第一步:在配备文件参加app名(我创建的app名为app01)

sqlite 9

 

第二步:
我mysqldb装不达到,为了方便用默认的sqllite数据库~

从而默认的sqlite数据库,就啥都休想转,直接扣第三步;当然要您mysqldb模块装及了,可以用mysql数据库试试,可在settings.py改下数据库连接的布置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'OldboyWebsite',    #确保此数据库已存在
        'HOST':'',
        'PORT':'',
        'USER':'root',
        'PASSWORD':''
    }
}

 

老三步: 创建表结构

 1 from django.db import models
 2 
 3 # Create your models here.
 4 class Author(models.Model):
 5     first_name = models.CharField(max_length=32)
 6     last_name = models.CharField(max_length=32)
 7     email = models.EmailField()
 8 
 9     def __str__(self):
10         return "<%s %s>" % (self.first_name,self.last_name)
11 
12     class Meta:
13         verbose_name_plural = u"作者"
14 
15 class Publisher(models.Model):
16     name = models.CharField(max_length=64, unique=True)
17     address = models.CharField(max_length=128,null=True,blank=True)
18     city = models.CharField(max_length=64)
19     state_province = models.CharField(max_length=64,help_text="put your province here",verbose_name=u"所属省")
20     country = models.CharField(max_length=64,editable=False)
21     website = models.URLField()
22 
23     def __str__(self):
24         return "<%s>" % (self.name)
25 
26 class Book(models.Model):
27     name = models.CharField(max_length=128)
28     authors = models.ManyToManyField(Author)   #书多对多到作者
29     publisher = models.ForeignKey(Publisher)  #一对多
30     publish_date = models.DateField()        #精确到天DateField()
31 
32     def __str__(self):
33         return "<%s %s>" % (self.name,self.publisher)

扣押上面的代码,如果你看了自己之前的博客sqlalchemy
orm和碉堡机表结构设计,就会意识django
orm进行多针对性大多涉及时莫用好来扭转中间表,天呐!!这可是方便了!!

汝或看不懂上面的help_text,verbose_name,editable,class
Meta:,def
__str__(self):…..这些自等下说,慢慢来,一下子就高潮就是不好了哄。

 

季步: 为了能以django后台的领队能查看到变化的说明,在app01/admin.py文件添加下面代码:

sqlite 10

 

第五步: 同步数据库

sqlite 11

 

第六步: 创建superuser

sqlite 12

 

第七步:
登陆admin并创建数量

sqlite 13

留神:
在创造表结构时,如果不在表对象吃参加def
__str__(self):方法(python3下),则会出现下面情况:无法显示出书的名目。
Python2对诺为def __unicode__(self):

sqlite 14

 

model field

型字段我这里谈话几单意意思就是吓了,更多的要参见官方文档。

更多models field
字段:https://docs.djangoproject.com/en/1.9/ref/models/fields/

  1. null & blank

    address = models.CharField(max_length=128,null=True)

以出版社表的address字段加上null = True;
此时address在admin后台仍未可知啊空!
须重新加上bland = True;
限制django admin可也空。

sqlite 15

六级没过之本人,差15分……来拘禁段官方英文热热身……只要你看得掌握,会意识英文真TM易懂,因为英文不见面生歧义。

sqlite 16

2. editable = False      
 表示未克改

自身大天朝的国籍企是你想更改便可知更改之……

country = models.CharField(max_length=64,editable=False)

sqlite 17

3. help_text = “xx”      
提示文字  不是针对数据库的修改,是对准django
admin页面的改动,所以当你增加是字段,你是匪用去一起数据库的。

state_province = models.CharField(max_length=64,help_text="put your province here")

sqlite 18

4. verbose_name  详细的名

state_province = models.CharField(max_length=64,help_text="put your province here",verbose_name=u"所属省")

sqlite 19

  1. class Meta:
    如果想协调在django后台定义表名,可在表明结构丰富下面的代码:

    class Meta:

         verbose_name_plural = u"作者"
    

sqlite 20

 

七、增删改查

上图!!

sqlite 21

sqlite 22

招来类型有:icontains(大小写不灵敏的LIKE),startswith和endswith,
还有range

sqlite 23

 

关于修改,有只点要留意下:

创新多个对象

每当“插入和创新数据”小节中,我们发出涉及模型的save()方法,这个点子会更新一行里之所有列。
而某些情况下,我们仅需要更新行里的某某几乎排列。

例如说我们现在纪念要用Apress
Publisher的号由原本的”Apress”更改为”Apress
Publishing”。若用save()方法,如:

>>> p = Publisher.objects.get(name='Apress')
>>> p.name = 'Apress Publishing'
>>> p.save()

立马同一于如下SQL语句:

SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE name = 'Apress';
 
UPDATE books_publisher SET
    name = 'Apress Publishing',
    address = '2855 Telegraph Ave.',
    city = 'Berkeley',
    state_province = 'CA',
    country = 'U.S.A.',
    website = 'http://www.apress.com'
WHERE id = 52;

(注意在此间我们假设Apress的ID为52)

 在这个事例里我们可以看Django的save()方法创新了非但是name列的价,还有创新了具有的排。
若name以外的排有或会见让另外的长河所改变的景况下,只重复改name列显然是越精明的。
更改某一样指定的排,我们得调用结果集(QuerySet)对象的update()方法:
示例如下:

>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')

及的对等与的SQL语句变得重复高速,并且不见面引起竞态条件。

UPDATE books_publisher
SET name = 'Apress Publishing'
WHERE id = 52;

update()方法对其他结果集(QuerySet)均有效,这表示你得以创新多长长的记下。
以下示例演示如何以有所Publisher的country字段值由’U.S.A’更改为’USA’:

>>> Publisher.objects.all().update(country='USA')
2

  

相关查询

咱们早就清楚如何对数码开展过滤与排序。
当然,通常咱们用以展开过滤跟排序查询的操作。
因此,你可以大概地描写成这种“链式”的形式:

>>> Publisher.objects.filter(country="U.S.A.").order_by("-name")
[<Publisher: O'Reilly>, <Publisher: Apress>]

公该无猜错,转换成为SQL查询就是 WHERE 和 ORDER BY 的组合:

SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE country = 'U.S.A'
ORDER BY name DESC;

  

事关查询

现在你找到了一如既往本书的对象b1,
书与作者既开展多对几近干,此时若想清楚开的作者是谁?

sqlite 24

 

删除

去除b1应声本开,看下图,删除b1时会拿写跟笔者中间表对诺内容为抹,真牛!!

sqlite 25

 

 

参考博客:
http://www.cnblogs.com/alex3714/articles/5457672.html
 大王这首博客写得最乱了……

写好久,脖子酸

倒车注明出处: http://www.cnblogs.com/0zcl/p/6562380.html 

 

网站地图xml地图