Django 学习 1 基础概念

    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 django.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 %} 的参数应该是字符串,但是如果直到运行时方能确定父模板名,这个参数也可以是个变量。这使得你能够实现一些很酷的动态功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值