Django

一、Django 简介

  Django 是一个是因为 Python 写成的开放源代码的 Web
应用框架。它最初是叫出来用于管理劳伦斯出版集团西下之片坐新闻内容为主的网站的,即凡
CMS(内容管理网)软件。并让2005年7月当 BSD
许可证下发布。这套框架是盖比利时底吉普赛爵士吉他手 Django Reinhardt
来命名的。由于 Django
的是于一个赶紧节奏的情报编辑室环境下开的,它的目的是要周边的 Web
开发任务,快速和爱。

 

MTV 模式

Django 采用了 MTV 设计模式

bifa365必发 1

上述图大概是说:

  1. URL ( urls.py )请求调度,当起缓存页面的时节一直返回内容。
  2. 目图函数( view.py )执行所要的操作,通常包括读写数据库。
  3. 范( models.py )定义了 Python
    中的多寡并与的并行。通常含在一个关系数据库( MySQL、PostgreSQL
    SQLite 等),其他数存储是可能的( XML、文本文件、LDAP、等)。
  4. 求执行任务后,视图返回一个 HTTP
    响应对象(通常是经过多少处理的一个模板)。可选的:视图可以保存一个版本的
    HTTP 响应对象,返回携带一个时刻戳,来喻浏览器是视图的换代时间。
  5. 模板通常返回 HTML 页面。Django 模板语言提供了 HTML 的语法及逻辑。

 bifa365必发 2

 

 安装

# pip 安装
pip install Django==1.10

# 克隆下载最新版本
git clone https://github.com/django/django.git

# 导入django模块
>>> import django
>>> print(django.get_version())
1.10

 

第二、基本配备

1、常用命令

# 查看django版本
$ python -m django --version

# 创建项目,名为mysite
$ django-admin startproject mysite

# 启动django
$ python manage.py runserver
$ python manage.py runserver 8080
$ python manage.py runserver 0.0.0.0:8000

# 创建应用程序,确保和 manage.py 是同一目录
$ python manage.py startapp polls

# 运行创造模型变化迁移
$ python manage.py makemigrations

# 运行应用模型变化到数据库
$ python manage.py migrate

# admin创建管理员用户
$ python manage.py createsuperuser

注:自动还加载 runserver,根据需要支付服务器自动重新加载Python代码为每个请求。您不需更起动服务器代码更改生效。然而,像长文件某些操作不接触重新开动,所以您不能不还起动于这些状况下之服务器。

中心目录结构及作用:

mysite/              # 项目的容器,名字随便起
    manage.py        # 命令行实用工具,以各种方式与该Django项目进行交互
    mysite/          # 实际的Python项目
        __init__.py  # 空文件,导入不出错
        settings.py  # 这个Django项目配置
        urls.py      # 这个Django项目的URL声明; 一个Django驱动网站的“目录”
        wsgi.py      # 一个入口点为WSGI兼容的Web服务器,以满足您的项目

 

 2、配置文件

数据库

# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替

# 如下设置放置的与project同名的配置的 __init__.py文件中

import pymysql
pymysql.install_as_MySQLdb() 

# 在settings 中修改DATABASES 

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}

模板 

# 也在settings里修改,放html文件

TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,'templates'),
    )

 静态文件

# 依然在settings里修改添加,放css,js等文件

STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'),
    )

 

 三、路由于网

1、URL 调度

一个完完全全,优雅的 URL 方案是一个大质量之 Web 应用程序的一个要的细节。

与 tornado 不同之是一个
url 对应一个函数,而不要一个类似。

如是一个新华字典的目,对承诺了 views 函数来展开拍卖,即是 url
要为此有指定的 views 函数处理。

来拘禁以下示例,如何动态构造:

from app1 import views

urlpatterns = [
    url(r'^manage1/(\d*)', views.manage1),
    url(r'^manage2/(?P<name>\w*)/(?P<id>\d*)', views.manage2),
    url(r'^manage3/(?P<name>\w*)', views.manage3,{'id':333}),
]

# 需要注意
# url多传了一个参数,那views函数得多接受一个参数 

bifa365必发 3bifa365必发 4

# 对应接收值

def manage1(request, age):
    print(age)        # 18
    return HttpResponse('1')

def manage2(request, name, id):
    print(name, id)     # nick 18
    return HttpResponse('2')

def manage3(request, name, id):
    print(name, id)     # nick 666
    return HttpResponse('3')

针对许 views 函数接收值

 

二级路由于: 这就是说若照 url 太多庸惩罚,全写一个在  urlpatterns
显得繁琐,so 二级路由于运用而分外

# 一级路由规定 app1 开头的都去 app1.urls 中找
# 二级在详细规定对应 views 函数

# 一级
urlpatterns = [
    url(r'^app1/', include('app1.urls')),
]

# 二级
urlpatterns = [
    url(r'^1$', views.manage1),
]

 

2、Django是怎处理一个请

当用户要于君的 Django 的网站页面,这是欠体系以以确定如何 Python
代码执行的算法:

  1. Django 请求是 URL 配置模块配置。通常通过值 ROOT_URLCONF 设置,但只要传入 HttpRequest 对象有 urlconf 属性(由中件装),它的价将顶替的可利用
     ROOT_URLCONF 的设置。
  2. Django 的载重是 Python 模块并查找变量 urlpatterns。这是一个 django.conf.urls.url() 实例。
  3. Django 的贯通每个 URL 模式,从而,在所要的 URL 匹配的第一单已。
  4. 若某个正则表达式相配合,就运行相对应之视图函数(或根据类的视图)。该视图给传送以下参数:
    • HttpRequest 对象。
    • 而匹配的正则表达式没有回来命名组,然后由正则表达式比赛是当职务参数。
    • 主要词参数是由于由正则表达式匹配的另外命名组,由指定的可选参数的外覆盖的 kwargs参数 django.conf.urls.url()。
  5. 如果没有正则表达式匹配,或者只要一个老大在是历程被的其他一样碰时提出,Django的调用适当的错误处理视图。

 

3、官方示例

1> 以下代码是官方示例:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

 笔记注意事项:

  • 假定捕获从URL中的价值,用括号括起来,会当参数传入 views 视图。
  • 从未必要添加一个斜线,因为每个URL都发生。例如,它^articles不是^/articles
  • 'r'前面的每个正则表达式字符串中凡是可选的,但建议。它报告Python字符串是“原始”
    -没有呀字符串中该进行转义。

 举例来说请求:

  • 请求 /articles/2005/03/以配合列表中的老三项。Django的将调用该函数 。views.month_archive(request,'2005', '03')
  • /articles/2005/3/  不会见配合任何 URL
    模式,因为以列表中的老三起中需简单各类数字之月。
  • /articles/2003/将匹配的列表,而休是次只第一美术,因为该图,以便测试,第一独凡是以首先测试通过。随意用顺序插入特殊情形是这样的。在此,Django的将调用该函数 views.special_case_2003(request)
  • /articles/2003 不配合任何这些模式,因为每个模式要求 URL
    以斜线结束。
  • /articles/2003/03/03/用匹配的末梢格局。Django
    的将调用该函数。views.article_detail(request,'2003', '03', '03')

 

 2> 命名组

地方的事例使用了简约的,非命名的正则表达式组(通过括号)来捕获 URL
的各类,并由此她们之职务参数的视图。在又高级的用法,它可行使命名 正则表达式组来捕获
URL 位,将其当做第一字参数传递给视图。

 在 Python
正则表达式,命名正则表达式组的语法(?P<name>pattern),这里 name凡是组的名称, pattern就算某种模式相配合。

 下面是点的事例中的URLconf,改写以命名组:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

随即恰恰就同样的作业,前面的例子,一个一线之出入:捕获的价值传递让查看功能作为重大字参数,而不是岗位参数。例如:

  • 请求/articles/2005/03/见面调用函数来替代,views.month_archive(request, year='2005',month='03')``views.month_archive(request, '2005', '03')
  • 请求/articles/2003/03/03/会调用该函数,views.article_detail(request, year='2003',month='03', day='03')

在实践中,这表示你的 URLconf 稍微重显,不爱参数顺序错误 –
你可以以你的意见’函数定义再度排序的参数。当然,这些亮点来在简约的花费; 一些开支任务命名组的语法丑陋,太长。

匹配/分组算法

此处的URL配置解析器遵循算法,相对于正则表达式命名组与非命名组:

  1. 一经产生其它命名参数,它见面用这些,而忽视非命名参数。
  2. 要不然,它见面经过拥有非命名参数作为职务参数。

以即时点儿种情景下,被给予以其他额外的严重性字参数传递额外的选取项来查阅功能为拿吃传送让视图

 

3> What the URLconf searches against

The URLconf searches against the requested URL, as a normal Python
string. This does not include GET or POST parameters, or the domain
name.

For example, in a request to https://www.example.com/myapp/, the
URLconf will look for myapp/.

In a request to https://www.example.com/myapp/?page=3, the URLconf
will look for myapp/.

欠URL配置不扣请求方法。换言之,所有的求的措施,GET,POST“ 等将让路由于到为同的URL,相同之效力。

 

4> 捕获的参数总是字符串

每个捕获的参数发送到视图作为普通的 Python
字符串,无论什么样的配合正则表达式匹配。

例如,在该URL配置行:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

…的 year参数传递给 views.year_archive()将是一个字符串,

莫是一个平头,即使 [0-9]{4}用独自相当配整数字符串。

 

5> 指定view的默认设置

 一个好之技能是您的眼光的论证指定默认参数。下面是一个例证的 RLconf 和理念:

# URLconf
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^blog/$', views.page),
    url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]

# View (in blog/views.py)
def page(request, num="1"):
    # Output the appropriate page of blog entries, according to num.
    ...

每当上述的事例中,两只 URL
模式对同一个视图 views.page但首先贪图案不抓获从 URL
任何东西。如果第一只模式匹配,该 page()函数将使它们的默认参数 num"1"。如果第二图案相匹配时, page()拿采取任何 num价值由正则表达式捕获。

 

 6> 包括其他的URLconf 

当另时刻,你urlpatterns可“include”其他的URLconf模块。这精神上是“roots”的一致模仿低于其它的网址。

譬如,这里的URL配置也节选的Django网站 本身。它包括多外的URLconf的:

from django.conf.urls import include, url

urlpatterns = [
    # ... snip ...
    url(r'^community/', include('django_website.aggregator.urls')),
    url(r'^contact/', include('django_website.contact.urls')),
    # ... snip ...
]

央留意,在这事例中,正则表达式没有一个$ (结束字符串匹配字符),但包括从斜线。每当 Django 的遇到 include()django.conf.urls.include()),它卧关闭其他匹配到该点的URL的一律片,并拿余下的字符串所涵盖的URL配置用于更的处理。

其它一样种可能性是经行使的列表,以囊括另外的网址格式
 url()实例。例如,考虑这 URL 配置:

from django.conf.urls import include, url

from apps.main import views as main_views
from credit import views as credit_views

extra_patterns = [
    url(r'^reports/$', credit_views.report),
    url(r'^reports/(?P<id>[0-9]+)/$', credit_views.report),
    url(r'^charge/$', credit_views.charge),
]

urlpatterns = [
    url(r'^$', main_views.homepage),
    url(r'^help/', include('apps.help.urls')),
    url(r'^credit/', include(extra_patterns)),
]

在这个事例中,/credit/reports/URL将受处理 credit_views.report()的Django图。

自打里单个图案前缀被重复使用的URLconf去除冗余。

咱俩可通过声明的一路路径前缀只生雷同糟,分组,例如这URL配置:

from django.conf.urls import include, url
from . import views

urlpatterns = [
    url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/', include([
        url(r'^history/$', views.history),
        url(r'^edit/$', views.edit),
        url(r'^discuss/$', views.discuss),
        url(r'^permissions/$', views.permissions),
    ])),
]

 

7> 传递额外的挑项来查功能

URLconf
有一个牵连,可以传递额外的参数为你的视图功能,作为一个 Python
字典。

django.conf.urls.url()作用可采取这应当是格外的参数的字典传递给视图功能可摘的老三独参数。

例如:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]

每当是例子中,用于向请求/blog/2005/,Django会调用 。views.year_archive(request, year='2005',foo='bar')

# 处理冲突

这可能有它可以捕获一个名为关键字参数的URL模式,并且还传递参数,在其额外的参数字典相同的名称。发生这种情况时,在字典中的参数将被用来代替在URL捕获的参数。

传送额外的选项来 include()

平等,您可以经额外的选项include()。当你通过额外的挑选include()每个着所蕴藏的URL配置线将经额外的选择项。

例如,这点儿只URL配置集在职能及是相同的:

# 设置一个:

# main.py
from django.conf.urls import include, url

urlpatterns = [
    url(r'^blog/', include('inner'), {'blogid': 3}),
]

# inner.py
from django.conf.urls import url
from mysite import views

urlpatterns = [
    url(r'^archive/$', views.archive),
    url(r'^about/$', views.about),
]

# 设置两个

# main.py
from django.conf.urls import include, url
from mysite import views

urlpatterns = [
    url(r'^blog/', include('inner')),
]

# inner.py
from django.conf.urls import url

urlpatterns = [
    url(r'^archive/$', views.archive, {'blogid': 3}),
    url(r'^about/$', views.about, {'blogid': 3}),
]

 

 

四、视图层

本着逻辑负责处理用户的要并回到响应。反回可以是HTML内容之网页,或再次定向,或404荒唐,或一个XML文件,或一个形象……此代码可以歇在另外你想去之地方,只要它在你的Python路径。

于一个文本被称将视图views.py,放在你的种类或者应用程序目录。

 1、返回快捷功能

render()

render(requesttemplate_namecontext=Nonecontent_type=Nonestatus=Noneusing=None)[source]

结给定的沙盘与一个加的上下文,返回一个字典HttpResponse在渲染文本对象

所用的参数

 template_name 一个模板的用或者模板序列名称全称。如果序列是加的,存在让第一独模板将吃运用。

可选参数

context    一组字典的值加加至模板被。默认情况下,这是一个拖欠的字典。

content_type    MIME类型用于转移文档。

status    为响应状态代码。默认值为200

using    这个名字一个模板引擎的行使以模板。

例子

from django.shortcuts import render

def my_view(request):
    # View code here...
    return render(request, 'myapp/index.html', {
        'foo': 'bar',
    }, content_type='application/xhtml+xml')

等价于

from django.http import HttpResponse
from django.template import loader

def my_view(request):
    # View code here...
    t = loader.get_template('myapp/index.html')
    c = {'foo': 'bar'}
    return HttpResponse(t.render(c, request), content_type='application/xhtml+xml')

 

 

render_to_response()

 render_to_response(template_namecontext=Nonecontent_type=Nonestatus=Noneusing=None)[source]

 这个与  render() 差不多,不推荐,在未来说不定丢掉掉

 

redirect()

 redirect(topermanent=False\args**kwargs*)[source]

 默认情况下,为即重定向;通过 permanent=True设置永久重定向

def my_view(request):
    ...
    return redirect('/some/url/')


def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object, permanent=True)

 

 2、求与应对象

Django 使用要和应对象在系统中传递状态。

当呼吁一个页面时,Django
创建一个 HttpRequest对象涵盖本数的乞求。然后 Django
加载适当的视图,通过 HttpRequest用作视图函数的首先单参数。每个视图负责返回一个HttpResponse目标。

HttpRequest对象

HttpRequest.scheme 

一个字符串表示请求的方案(HTTP或HTTPS)通常

HttpRequest.path

一个字符串的完整路径的请求

HttpRequest.method

请求的HTTP方法。这是保证要大写

if request.method == ‘GET’:
do_something()
elif request.method == ‘POST’:
do_something_else()

HttpRequest.GET

字典像包含所有给定的HTTP GET参数对象。

HttpRequest.POST

字典像包含所有给定的HTTP POST参数对象,提供请求包含表单数据。

HttpRequest.COOKIES

一个标准的Python字典,包含了所有的COOKIES,key和values都是字符串

HttpRequest.FILES

字典像对象包含所有上传的文件。
html 标签 <input type="file" name="" />

filename # 上传的文本名
content_type # 上污染文书之路
content # 上传文书的内容

HttpRequest.META

一个标准的Python字典包含所有可用的HTTP头。可用标题取决于客户端和服务器,但这里是一些例子:

CONTENT_LENGTH – 请求体的尺寸(一个字符串)。
CONTENT_TYPE – 请求体的品类。
HTTP_ACCEPT – 为响应–可以领的情类型。
HTTP_ACCEPT_ENCODING – 接受编码的应
HTTP_ACCEPT_LANGUAGE – 接受语言的反馈
HTTP_HOST – 客户端发送的HTTP主机头。
HTTP_REFERER – 参考页面
HTTP_USER_AGENT – 客户端的用户代理字符串。
QUERY_STRING – 查询字符串,作为一个单纯的(分析的)字符串。
REMOTE_ADDR – 客户端的IP地址
REMOTE_HOST – 客户端的主机名
REMOTE_USER – 用户通过Web服务器的身份验证。
REQUEST_METHOD – 字符串,如”GET”或”POST”
SERVER_NAME – 服务器的主机名
SERVER_PORT – 服务器的端口(一个字符串)。

 

HttpResponse对象

 对于HttpRequest 对象的话,是出于django自动创建的,但是,HttpResponse
对象就是不能不我们自己创建。每个 view 请求处理办法必须返回一个 HttpResponse
对象。

HttpResponse 类在 django.http.HttpResponse

 字符串使用:

卓越的用法是经过页面的情节,为一个字符串

>>> from django.http import HttpResponse
>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", content_type="text/plain")

# 如果你想添加内容的增量
>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")

特点和措施:

HttpResponse.content

一个bytestring代表内容

 HttpResponse.charset

一个字符串的字符集表示的响应将编码

HttpResponse.status_code

HTTP状态代码为响应码

HttpResponse.streaming

这个属性永远为假,一般用于中间件

HttpResponse.closed

关闭

 

方法:

HttpResponse.__init__(content=”, content_type=None, status=200,
reason=None, charset=None)[source]

实例化类自动执行的方法

HttpResponse.__setitem__(header, value)

为给定值给定的标题名称。都是字符串

HttpResponse.__delitem__(header)

删除标题的名称。不区分大小写。

HttpResponse.__getitem__(header)

获取给定标题名称。不区分大小写。

HttpResponse.has_header(header)

检查是否具有给定名称的一个标题

HttpResponse.setdefault(header, value)

设置一个标题,除非它已经设置。

HttpResponse.set_cookie(key, value=”, max_age=None, expires=None,
path=’/’, domain=None, secure=None, httponly=False)

设置一个cookie。参数跟标准库的Cookie对象差不多

HttpResponse.set_signed_cookie(key, value, salt=”, max_age=None,
expires=None, path=’/’, domain=None, secure=None, httponly=True)

加密cookice,可以用 HttpRequest.get_signed_cookie() 获取,当然你也可以加盐

HttpResponse.delete_cookie(key, path=’/’, domain=None)

删除Cookie与给定键。

 

HttpResponse子类:

class HttpResponseRedirect[source]

构造函数的第一个参数是必需的–路径redirectto。这是一个完全合格的URL(例如“https://www.yahoo.com /搜索/),没有一个绝对的路径(例如域搜索/ /),甚至是相对路径(如“/”)。在最后的情况下,客户端浏览器将重建完整的URL本身的电流路径。看到HttpResponse其他optionalconstructor参数。请注意,这将返回一个HTTP状态代码302。

class HttpResponsePermanentRedirect[source]

像httpresponseredirect,但它返回一个永久重定向(HTTP状态代码301)而不是“发现”的重定向(状态代码302)

class HttpResponseNotModified[source]

构造函数不带任何参数和NO含量应该被添加到这一反应。使用指定一个页面没有被modifiedsince用户的最后一个请求(状态代码304)。

class HttpResponseBadRequest[source]

就像HttpResponse但使用400状态码

class HttpResponseNotFound[source]

就像HttpResponse但使用404状态码

class HttpResponseForbidden[source]

就像HttpResponse但使用403状态码

class HttpResponseNotAllowed[source]

像HttpResponse,但使用405状态码。第一argumentto构造函数要求准许清单的方法(如(get,后])

class HttpResponseGone[source]

就像HttpResponse但使用410状态码

class HttpResponseServerError[source]

就像HttpResponse但使用500状态码

 

 

五、模板层

  作为一个Web框架,Django 需要模板。模板包含所欲的 HTML
输出静态部分与动态内容插入。

1、模版的执行

bifa365必发 5bifa365必发 6

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

from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print t.render(c)

import datetime
from django import template
import DjangoDemo.settings

now = datetime.datetime.now()
fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date': now}))
return HttpResponse(html

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))

示例

 

2、模版语言

 模板被吗产生友好之言语,该语言可以实现数据显示

  • {{ item }}
  • {% for item in item_list %}  <a>{{ item }}</a>  {%
    endfor %}
      forloop.counter
      forloop.first
      forloop.last 
  • {% if ordered_warranty %}  {% else %} {% endif %}
  • 母板:{% block title %}{% endblock %}
    子板:{% extends “base.html” %}
       {% block title %}{% endblock %}
  • 援方法:
    {{ item.event_start|date:”Y-m-d H:i:s”}}
    {{ bio|truncatewords:”30″ }}
    {{ my_list|first|upper }}
    {{ name|lower }}

 

3、自定义simple_tag

a、在app中创建templatetags模块

b、创建任意 .py 文件,如:xx.py

#!/usr/bin/env python
#coding:utf-8
from django import template
from django.utils.safestring import mark_safe
from django.template.base import resolve_variable, Node, TemplateSyntaxError

register = template.Library()

@register.simple_tag
def my_simple_time(v1,v2,v3):
    return  v1 + v2 + v3

@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)

c、在动自定义simple_tag的html文件被导入之前创建的 xx.py 文件称

{% load xx %}

d、使用simple_tag

{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}

e、在settings中配备时app,不然django无法找到打定义的simple_tag

bifa365必发 7bifa365必发 8

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
)

View Code

 

 

六、Model 层

Django提供了一个抽象层(“Model”)的构建和保管Web应用程序的数额。

  • 每个模型是一个Python类,子类d jango.db.models.model
  • 型中之每个属性代表一个数据库字段。

 

大概的例子

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

 

参数和字段

bifa365必发 9bifa365必发 10

1、models.AutoField  自增列 = int(11)
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField  字符串字段
  必须 max_length 参数
3、models.BooleanField  布尔类型=tinyint(1)
  不能为空,Blank=True
4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
5、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField  日期类型 datetime
  同DateField的参数
7、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
8、models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
9、models.FloatField  浮点类型 = double
10、models.IntegerField  整形
11、models.BigIntegerField  长整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
12、models.IPAddressField  字符串类型(ip4正则表达式)
13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
14、models.NullBooleanField  允许为空的布尔类型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  减号、下划线、字母、数字
18、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正则表达式
22、models.BinaryField  二进制
23、models.ImageField   图片
24、models.FilePathField 文件

复多字段

bifa365必发 11bifa365必发 12

1、null=True
  数据库中字段是否可以为空
2、blank=True
  django的 Admin 中添加数据时是否可允许空值
3、primary_key = False
  主键,对AutoField设置主键后,就会代替原来的自增 id 列
4、auto_now 和 auto_now_add
  auto_now   自动创建---无论添加或修改,都是当前操作的时间
  auto_now_add  自动创建---永远是创建时的时间
5、choices
GENDER_CHOICE = (
        (u'M', u'Male'),
        (u'F', u'Female'),
    )
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default  默认值
8、verbose_name  Admin中字段的显示名称
9、name|db_column  数据库中的字段名称
10、unique=True  不允许重复
11、db_index = True  数据库索引
12、editable=True  在Admin里是否可编辑
13、error_messages=None  错误提示
14、auto_created=False  自动创建
15、help_text  在Admin中提示帮助信息
16、validators=[]
17、upload-to

复多参数

 

连表结构

  • 一对多:models.ForeignKey(其他表)
  • 多对多:models.ManyToManyField(其他表)
  • 一对一:models.OneToOneField(其他表)

 

操作表

1、基本操作

# 增    
models.Tb1.objects.create(c1='xx', c2='oo')  # 增加一条数据,可以接受字典类型数据 **kwargs

obj = models.Tb1(c1='xx', c2='oo')
obj.save()

# 查    
models.Tb1.objects.get(id=123)          # 获取单条数据,不存在则报错(不建议)
models.Tb1.objects.all()                # 获取全部
models.Tb1.objects.filter(name='seven') # 获取指定条件的数据

# 删    
models.Tb1.objects.filter(name='nick').delete() # 删除指定条件的数据

# 改models.Tb1.objects.filter(name='nick').update(gender='0')  # 将指定条件的数据更新,均支持