您的位置:首页 > 编程语言 > Go语言

Django 学习 1 基础概念

2015-07-24 17:03 701 查看
    0.Django的MVC设计模式:

        ——models.py 文件主要用一个 Python 类来描述数据表。称为 模型(model) 。运用这个类,你可以通过简单的 Python 的代码来创建、检索、更新、删除数据库中的记录而无需写一条又一条的SQL语句。

        ——view.py 文件的 latest_books() 函数中包含了该页的业务层逻辑。这个函数叫做 视图(view) 。

        ——urls.py 指出了什么样的 URL 调用什么的视图,在这个例子中 /latest/ URL 将会调用 latest_books() 这个函数
        ——latest_books.html 是 html 模板,它描述了这个页面的设计是如何的。



    1.生成项目
>>>django-admin startproject mysite
>>>tree /f


结构:
└─mysite
│  db.sqlite3
│  manage.py
│  views.py
│
└─mysite
│  settings.py
│  urls.py
│  wsgi.py
│  __init__.py
│
└─templates
base.html
current_time.html
hours_ahead.html


    ——__init__.py :让 Python 把该目录当成一个开发包 (即一组模块)所需的文件。

    ——manage.py :一种命令行工具,可让你以多种方式与该 Django 项目进行交互。

    ——settings.py :该 Django 项目的设置或配置。

    ——urls.py :该 Django 项目的 URL 声明,即 Django 所支撑站点的内容列表

    2.发布服务器:
>>>python manage.py runserver 0.0.0.0:8080


    3.views:

    3.1视图:

    views.py codes:

      
from djang
4000
o.http import HttpResponse
from django.template import Context
import datetime
from django.template.loader import get_template
from django.shortcuts import render_to_response

def current_datetime(request):
now = datetime.datetime.now()
#    html = "<html><body>It is %s now.</body></html>"% now
#    return HttpResponse(html)
return HttpResponse(get_template("current_time.html").render(Context({'now':now})))

def hours_ahead(request, offset):
dt = datetime.datetime.now() + datetime.timedelta(hours=int(offset))
#    t = get_template('hours_ahead.html')
#    html = t.render(Context({'offset':offset,'dt':dt}))
#    return HttpResponse(html)
#    return render_to_response('hours_ahead.html',{'offset':offset,'dt':dt})
return render_to_response('hours_ahead.html',locals())
#    render_to_response() package get_template()


    3.2将 URL 映射到视图:

    urls.py codes:
from django.conf.urls import include, url
from django.contrib import admin
from views import current_datetime
from views import hours_ahead

urlpatterns = [
url(r'^time/$',current_datetime),
url(r'^time/(\d{1,2})/$',hours_ahead),
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),

url(r'^admin/', include(admin.site.urls)),
]


    第一个参数是一个正则表达式,用于表示被匹配的所有网址,第二个参数是view函数

    4.Django模板:

    Django 模板是用于分割文档的表示(presentation)和数据(data)的字符串文本。模板定义了占位符(placeholders)和各种定义文档应该如何显示的基本逻辑(即模板标签,template tag)。通常,模板用来生成 HTML,但是 Django 模板同样能够生成任何基于文本的格式。

    4.1语法:

    4.1.1HTML部分:

    变量:{{var}}

    模板标签:{%key_words%}{%endkey_word%}

    过滤器:{{var|filter:"args+type" }}

    4.1.2Python部分:

    4.1.2.1创建和渲染:

    
from django.template import Context, Template

t = Template("My name is {{ name }}.")
c = Context({"name": "Stephane"})
t.render(c)


       

'My name is Stephane.'


    4.1.2.2Context:与字典类似,同时提供了更多的方法:句点可以访问字典的键值、属性、索引和对象的方法。

    当模板系统在变量名中遇到点时,按照以下顺序尝试进行查找:

        ——字典类型查找 (比如 foo["bar"] )

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

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

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

    多个背景(Context)可以渲染同一个模板
t = Template('Hello, {{ name }}')
for name in ('John', 'Julie', 'Pat'):
print t.render(Context({'name': name}))


    4.1.2.3TAG:不支持用圆括号来组合比较操作

        1.{%if%}[{%else%}]{%endif%}:

        ——Python 的“真值”:在python中空的列表 ( [] ),tuple( () ),字典( {} ),字符串( '' ),零( 0 ),还有 None 对象,在逻辑判断中都为假,其他的情况都为真。

        ——{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断,或者对变量取反( not ),不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的;没有 {% elif %} 标签,请使用嵌套的 {% if %} 标签来达成同样的效果.

        2.{%for %}{%endfor%}:

        ——给标签增加一个 reversed 使得该列表被反向迭代;Django不支持退出循环操作。如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部;

        {% for %} 标签在循环中设置了一个特殊的 forloop 模板变量。这个变量能提供一些当前循环进展的信息:

            ——forloop.counter0 类似于 forloop.counter ,但是它是从0计数的。第一次执行循环时这个变量会被设置为0。

            ——forloop.revcounter 是表示循环中剩余项的整型变量。在循环初次执行时 forloop.revcounter 将被设置为序列中项的总数。最后一次循环执行中,这个变量将被置1。
            ——forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1。在最后一次迭代时,该变量为0。

            ——forloop.first 是一个布尔值。在第一次执行循环时该变量为True,在下面的情形中这个变量是很有用的。

            ——forloop.last 是一个布尔值;在最后一次执行循环时被置为True。一个常见的用法是在一系列的链接之间放置管道符(|)

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

        3.{%ifequal/ifnotequal var1 var2%}:

        {% ifequal %} 支持可选的 {% else%} 标签;只有模板变量,字符串,整数和小数可以作为 {% ifequal %} 标签的参数;

        4.注释使用 {# #}

    4.1.2.4过滤器:{{ name|lower }}:模板过滤器是在变量被显示前修改它的值的一个简单方法;过滤器参数总是使用双引号标识。

        1.|lower 小写

        2.|escape 转义符号

        3.|linebreaks 转换每行到 <p> 标签

        4.|truncatewords "30" 显示前30个字符

        5.|addslashes 添加反斜杠到任何反斜杠、单引号或者双引号前面

        6.|date 按指定的格式字符串参数格式化 date 或者 datetime 对象

        7.|length 返回变量的长度

    4.2.1模板加载:为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板,要使用此模板加载API,首先你必须将模板的保存位置告诉框架。该项工作在 设置文件 中完成。

    settings.py codes:
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__),'templates').replace('\\','/'),
)


    Python 内部变量 __file__ ,该变量被自动设置为代码所在的 Python 模块文件名。

    views.py codes:
from django.http import HttpResponse
from django.template import Context
import datetime
from django.template.loader import get_template

def current_datetime(request):
now = datetime.datetime.now()
#    html = "<html><body>It is %s now.</body></html>"% now
#    return HttpResponse(html)
return HttpResponse(get_template("current_time.html").render(Context({'now':now})))


    get_template()传入一个html位置,返回一个模板对象

    在模板目录中创建包括以下模板代码 current_datetime.html 文件:

    4.2.2封装方法render_to_response():封装了加载模板、填充 context 、将经解析的模板结果返回为 HttpResponse的一系列过程

    views codes:
from django.shortcuts import render_to_response
import datetime

def hours_ahead(request, offset):
dt = datetime.datetime.now() + datetime.timedelta(hours=int(offset))
return render_to_response('hours_ahead.html',{'offset':offset,'dt':dt})


    render_to_response() 的第一个参数必须是要使用的模板名称。如果要给定第二个参数,那么该参数必须是为该模板创建 Context 时所使用的字典。如果不提供第二个参数, render_to_response() 使用一个空字典。

    4.2.3locals()方法:它返回的字典对所有局部变量的名称与值进行映射。因此,前面的视图可以重写成下面这个样子:

    views codes:
from django.shortcuts import render_to_response
import datetime

def hours_ahead(request, offset):
dt = datetime.datetime.now() + datetime.timedelta(hours=int(offset))
return render_to_response('hours_ahead.html',locals())


    4.2.4内建模板标签{% include "model.html" %}

    该标签允许在(模板中)包含其它的模板的内容。标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。

    4.2.5模板继承(母版和子版)

    4.2.5.1第一步是定义 基础模板 , 该框架之后将由 子模板 所继承。

    base.html codes:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>

<h1>My helpful timestamp site</h1>
{% block content %}{% endblock %}
{% block footer %}
<hr>
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>

</html>


    {% block %} 标签告诉模板引擎,子模板可以重载这些部分。

    4.2.5.2子模版使用基础板

    hours_ahead.html codes:
{% extends "base.html" %}

{% block title %}The hours ahead page{% endblock %}

{% block content %}
<p>In {{offset}} hour(s), it will be {{dt}}.</p>
{% endblock %}


    继承并不改变 context 的工作方式,而且你可以按照需要使用多层继承。使用继承的一种常见方式是下面的三层法:

        ——创建 base.html 模板,在其中定义站点的主要外观感受。这些都是不常修改甚至从不修改的部分。

        ——为网站的每个区域创建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。这些模板对 base.html 进行拓展,并包含区域特定的风格与设计。

        ——为每种类型的页面创建独立的模板,例如论坛页面或者图片库。这些模板拓展相应的区域模板。

        ——如果需要获得父模板中代码块的内容,可以使用 {{ block.super }} 变量。如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。

        ——多数情况下, {% extends %} 的参数应该是字符串,但是如果直到运行时方能确定父模板名,这个参数也可以是个变量。这使得你能够实现一些很酷的动态功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  django mvc