zoukankan      html  css  js  c++  java
  • Django框架使用

    ---恢复内容开始---

    Django 创建第一个项目

    本章我们将介绍Django 管理工具及如何使用 Django 来创建项目,第一个项目我们以 HelloWorld 来命令项目。

    Django 管理工具

    安装 Django 之后,您现在应该已经有了可用的管理工具 django-admin.py。我们可以使用 django-admin.py 来创建一个项目:

    我们可以来看下django-admin.py的命令介绍:

    [root@solar ~]# django-admin.py

    Usage: django-admin.py subcommand [options] [args]

    Options:

      -v VERBOSITY, --verbosity=VERBOSITY

                            Verbosity level; 0=minimal output, 1=normal output,

                            2=verbose output, 3=very verbose output

      --settings=SETTINGS The Python path to a settings module, e.g.

                            "myproject.settings.main". If this isn't provided, the

                            DJANGO_SETTINGS_MODULE environment variable will be

                            used.

      --pythonpath=PYTHONPATH

                            A directory to add to the Python path, e.g.

                            "/home/djangoprojects/myproject".

      --traceback Raise on exception

      --version show program's version number and exit

      -h, --help show this help message and exit

    Type 'django-admin.py help <subcommand>' for help on a specific subcommand.

    Available subcommands:

    [django]

        check

        cleanup

        compilemessages

        createcachetable

    ……省略部分……

    创建第一个项目

    使用 django-admin.py 来创建 HelloWorld 项目:

    django-admin.py startproject HelloWorld

    创建完成后我们可以查看下项目的目录结构:

    [root@solar ~]# cd HelloWorld/

    [root@solar HelloWorld]# tree

    .

    |-- HelloWorld

    | |-- __init__.py

    | |-- settings.py

    | |-- urls.py

    | `-- wsgi.py

    `-- manage.py

    目录说明:

    HelloWorld: 项目的容器。

    manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。

    HelloWorld/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。

    HelloWorld/settings.py: 该 Django 项目的设置/配置。

    HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。

    HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

    接下来我们进入 HelloWorld 目录输入以下命令,启动服务器:

    python manage.py runserver 0.0.0.0:8000

    0.0.0.0让其它电脑可连接到开发服务器,8000为端口号。如果不说明,那么端口号默认为8000。

    在浏览器输入你服务器的ip及端口号,如果正常启动,输出结果如下:

    视图和 URL 配置

    在先前创建的 HelloWorld 目录下的 HelloWorld 目录新建一个 view.py 文件,并输入代码:

    from django.http import HttpResponse

    def hello(request):

     return HttpResponse("Hello world ! ")

    接着,绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:

    from django.conf.urls import *

    from HelloWorld.view import hello

    urlpatterns = patterns("",

     ('^hello/$', hello),

    )

    整个目录结构如下:

    [root@solar HelloWorld]# tree

    .

    |-- HelloWorld

    | |-- __init__.py

    | |-- __init__.pyc

    | |-- settings.py

    | |-- settings.pyc

    | |-- urls.py # url 配置

    | |-- urls.pyc

    | |-- view.py # 添加的视图文件

    | |-- view.pyc # 编译后的视图文件

    | |-- wsgi.py

    | `-- wsgi.pyc

    `-- manage.py

    完成后,启动 Django 开发服务器,并在浏览器访问打开浏览器并访问:

    Django 模板

    在上一章节中我们使用 django.http.HttpResponse() 来输出"Hello World!"。该方式将数据与视图混合在一起,不符合Django的MVC思想。

    本章节我们将为大家详细介绍 Django 模板的应用,模板是一个文本,用于分离文档的表现形式和内容。

    模板应用实例

    我们接着上一章节的项目将在 HelloWorld 目录底下创建 templates 目录并建立 hello.html文件,整个目录结构如下:

    HelloWorld/

    |-- HelloWorld

    | |-- __init__.py

    | |-- __init__.pyc

    | |-- settings.py

    | |-- settings.pyc

    | |-- urls.py

    | |-- urls.pyc

    | |-- view.py

    | |-- view.pyc

    | |-- wsgi.py

    | `-- wsgi.pyc

    |-- manage.py

    `-- templates

        `-- hello.html

    hello.html 文件代码如下:

    <h1>{{ hello }}</h1>

    从模板中我们知道变量使用了双括号。

    接下来我们需要向Django说明模板文件的路径,修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 为[BASE_DIR+"/templates",],如下所示:

    TEMPLATES = [

        {

            'BACKEND': 'django.template.backends.django.DjangoTemplates',

            'DIRS': [BASE_DIR+"/templates",],

            'APP_DIRS': True,

            'OPTIONS': {

                'context_processors': [

                    'django.template.context_processors.debug',

                    'django.template.context_processors.request',

                    'django.contrib.auth.context_processors.auth',

                    'django.contrib.messages.context_processors.messages',

                ],

            },

        },

    ]

    我们现在修改 view.py,增加一个新的对象,用于向模板提交数据:

    # -*- coding: utf-8 -*-

    #from django.http import HttpResponse

    from django.shortcuts import render

    def hello(request):

        context = {}

        context['hello'] = 'Hello World!'

        return render(request, 'hello.html', context)

    可以看到,我们这里使用render来替代之前使用的HttpResponse。render还使用了一个字典context作为参数。

    context 字典中元素的键值 "hello" 对应了模板中的变量 "{{ hello }}"。

    再访问访问http://192.168.45.3:8000/hello/,可以看到页面:

    这样我们就完成了使用模板来输出数据,从而实现数据与视图分离。

    接下来我们将具体介绍模板中常用的语法规则。

    Django 模板标签

    if/else 标签

    基本语法格式如下:

    {% if condition %}

         ... display

    {% endif %}

    或者:

    {% if condition1 %}

       ... display 1

    {% elif condiiton2 %}

       ... display 2

    {% else %}

       ... display 3

    {% endif %}

    根据条件判断是否输出。if/else 支持嵌套。

    {% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:

    {% if athlete_list and coach_list %}

         athletes 和 coaches 变量都是可用的。

    {% endif %}

    for 标签

    {% for %} 允许我们在一个序列上迭代。

    与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。

    每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。

    例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:

    <ul>

    {% for athlete in athlete_list %}

        <li>{{ athlete.name }}</li>

    {% endfor %}

    </ul>

    给标签增加一个 reversed 使得该列表被反向迭代:

    {% for athlete in athlete_list reversed %}

    ...

    {% endfor %}

    可以嵌套使用 {% for %} 标签:

    {% for athlete in athlete_list %}

        <h1>{{ athlete.name }}</h1>

        <ul>

        {% for sport in athlete.sports_played %}

            <li>{{ sport }}</li>

        {% endfor %}

        </ul>

    {% endfor %}

    ifequal/ifnotequal 标签

    {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。

    下面的例子比较两个模板变量 user 和 currentuser :

    {% ifequal user currentuser %}

        <h1>Welcome!</h1>

    {% endifequal %}

    和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:8

    {% ifequal section 'sitenews' %}

        <h1>Site News</h1>

    {% else %}

        <h1>No News Here</h1>

    {% endifequal %}

    注释标签

    Django 注释使用 {# #}。

    {# 这是一个注释 #}

    过滤器

    模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:

    {{ name|lower }}

    {{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。

    过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:

    {{ my_list|first|upper }}

    以上实例将第一个元素并将其转化为大写。

    有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含。 例如:

    {{ bio|truncatewords:"30" }}

    这个将显示变量 bio 的前30个词。

    其他过滤器:

    addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。

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

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

    length : 返回变量的长度。

    include 标签

    {% include %} 标签允许在模板中包含其它的模板的内容。

    下面这两个例子都包含了 nav.html 模板:

    {% include "nav.html" %}

    模板继承

    模板可以用继承的方式来实现复用。

    接下来我们先创建之前项目的 templates 目录中添加 base.html 文件,代码如下:

    <html>

      <head>

        <title>Hello World!</title>

      </head>

      <body>

        <h1>Hello World!</h1>

        {% block mainbody %}

           <p>original</p>

        {% endblock %}

      </body>

    </html>

    以上代码中,名为mainbody的block标签是可以被继承者们替换掉的部分。

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

    hello.html中继承base.html,并替换特定block,hello.html修改后的代码如下:

    {% extends "base.html" %}

    {% block mainbody %}

    <p>继承了 base.html 文件</p>

    {% endblock %}

    第一行代码说明hello.html继承了 base.html 文件。可以看到,这里相同名字的block标签用以替换base.html的相应block。

    重新访问地址http://192.168.45.3:8000/hello/,输出结果如下:

    Django 模型

    Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

    Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。

    MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例进行介绍。你可以通过本站的 MySQL 教程 了解更多Mysql的基础知识。

    数据库配置

    我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

    DATABASES = {

        'default': {

            'ENGINE': 'django.db.backends.mysql',

            'NAME': 'test',

            'USER': 'test',

            'PASSWORD': 'test123',

            'HOST':'localhost',

            'PORT':'3306',

        }

    }

    上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。

    定义模型

    创建 APP

    Django规定,如果要使用模型,必须要创建一个app。我们使用以下命令创建一个 TestModel 的 app:

    python manage.py startapp TestModel

    目录结构如下:

    HelloWorld

    |-- TestModel

    | |-- __init__.py

    | |-- admin.py

    | |-- models.py

    | |-- tests.py

    | `-- views.py

    我们修改 TestModel/models.py文件,代码如下:

    # models.py

    from django.db import models

    class Test(models.Model):

        name = models.CharField(max_length=20)

    以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

    接下来在settings.py中找到INSTALLED_APPS这一项,如下:

    INSTALLED_APPS = (

        'django.contrib.admin',

        'django.contrib.auth',

        'django.contrib.contenttypes',

        'django.contrib.sessions',

        'django.contrib.messages',

        'django.contrib.staticfiles',

        'TestModel', # 添加此项

    )

    在命令行中运行python manage.py syncdb,看到几行"Creating table…"的字样,你的数据表就创建好了。

    Creating tables ...

    ……

    Creating table TestModel_test #我们自定义的表

    ……

    表名组成结构为:app名_类名(如:TestModel_test)。

    注意:尽管我们没有在models给表设置主键,但是Django会自动添加一个id作为主键。

    数据库操作

    接下来我们在 HelloWorld 目录中添加 testdb.py 文件,并修改urls.py:

    from django.conf.urls import *

    from HelloWorld.view import hello

    from HelloWorld.testdb import testdb

    urlpatterns = patterns("",

            ('^hello/$', hello),

            ('^testdb/$', testdb),

    )

    添加数据

    添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:

    # -*- coding: utf-8 -*-

    from django.http import HttpResponse

    from TestModel.models import Test

    # 数据库操作

    def testdb(request):

     test1 = Test(name='w3cschool.cc')

     test1.save()

     return HttpResponse("<p>数据添加成功!</p>")

    访问http://192.168.45.3:8000/testdb/ 就可以看到数据添加成功的提示。

    获取数据

    Django提供了多种方式来获取数据库的内容,如下代码所示:

    # -*- coding: utf-8 -*-

    from django.http import HttpResponse

    from TestModel.models import Test

    # 数据库操作

    def testdb(request):

     # 初始化

     response = ""

     response1 = ""

     # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM

     list = Test.objects.all()

      

     # filter相当于SQL中的WHERE,可设置条件过滤结果

     response2 = Test.objects.filter(id=1) 

     # 获取单个对象

     response3 = Test.objects.get(id=1) 

     # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;

     Test.objects.order_by('name')[0:2]

     #数据排序

     Test.objects.order_by("id")

     # 上面的方法可以连锁使用

     Test.objects.filter(name="w3cschool.cc").order_by("id")

     # 输出所有数据

     for var in list:

      response1 += var.name + " "

     response = response1

     return HttpResponse("<p>" + response + "</p>")

    输出结果如下图所示:

    更新数据

    修改数据可以使用 save() 或 update():

    # -*- coding: utf-8 -*-

    from django.http import HttpResponse

    from TestModel.models import Test

    # 数据库操作

    def testdb(request):

     # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE

     test1 = Test.objects.get(id=1)

     test1.name = 'w3cschool菜鸟教程'

     test1.save()

     # 另外一种方式

     #Test.objects.filter(id=1).update(name='w3cschool菜鸟教程')

     # 修改所有的列

     # Test.objects.all().update(name='w3cschool菜鸟教程')

     return HttpResponse("<p>修改成功</p>")

    删除数据

    删除数据库中的对象只需调用该对象的delete()方法即可:

    # -*- coding: utf-8 -*-

    from django.http import HttpResponse

    from TestModel.models import Test

    # 数据库操作

    def testdb(request):

     # 删除id=1的数据

     test1 = Test.objects.get(id=1)

     test1.delete()

     # 另外一种方式

     # Test.objects.filter(id=1).delete()

     # 删除所有数据

     # Test.objects.all().delete()

     return HttpResponse("<p>删除成功</p>")Django 创建第一个项目

    本章我们将介绍Django 管理工具及如何使用 Django 来创建项目,第一个项目我们以 HelloWorld 来命令项目。

    Django 管理工具

    安装 Django 之后,您现在应该已经有了可用的管理工具 django-admin.py。我们可以使用 django-admin.py 来创建一个项目:

    我们可以来看下django-admin.py的命令介绍:

    [root@solar ~]# django-admin.py

    Usage: django-admin.py subcommand [options] [args]

    Options:

      -v VERBOSITY, --verbosity=VERBOSITY

                            Verbosity level; 0=minimal output, 1=normal output,

                            2=verbose output, 3=very verbose output

      --settings=SETTINGS The Python path to a settings module, e.g.

                            "myproject.settings.main". If this isn't provided, the

                            DJANGO_SETTINGS_MODULE environment variable will be

                            used.

      --pythonpath=PYTHONPATH

                            A directory to add to the Python path, e.g.

                            "/home/djangoprojects/myproject".

      --traceback Raise on exception

      --version show program's version number and exit

      -h, --help show this help message and exit

    Type 'django-admin.py help <subcommand>' for help on a specific subcommand.

    Available subcommands:

    [django]

        check

        cleanup

        compilemessages

        createcachetable

    ……省略部分……

    创建第一个项目

    使用 django-admin.py 来创建 HelloWorld 项目:

    django-admin.py startproject HelloWorld

    创建完成后我们可以查看下项目的目录结构:

    [root@solar ~]# cd HelloWorld/

    [root@solar HelloWorld]# tree

    .

    |-- HelloWorld

    | |-- __init__.py

    | |-- settings.py

    | |-- urls.py

    | `-- wsgi.py

    `-- manage.py

    目录说明:

    HelloWorld: 项目的容器。

    manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。

    HelloWorld/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。

    HelloWorld/settings.py: 该 Django 项目的设置/配置。

    HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。

    HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

    接下来我们进入 HelloWorld 目录输入以下命令,启动服务器:

    python manage.py runserver 0.0.0.0:8000

    0.0.0.0让其它电脑可连接到开发服务器,8000为端口号。如果不说明,那么端口号默认为8000。

    在浏览器输入你服务器的ip及端口号,如果正常启动,输出结果如下:

    视图和 URL 配置

    在先前创建的 HelloWorld 目录下的 HelloWorld 目录新建一个 view.py 文件,并输入代码:

    from django.http import HttpResponse

    def hello(request):

     return HttpResponse("Hello world ! ")

    接着,绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:

    from django.conf.urls import *

    from HelloWorld.view import hello

    urlpatterns = patterns("",

     ('^hello/$', hello),

    )

    整个目录结构如下:

    [root@solar HelloWorld]# tree

    .

    |-- HelloWorld

    | |-- __init__.py

    | |-- __init__.pyc

    | |-- settings.py

    | |-- settings.pyc

    | |-- urls.py # url 配置

    | |-- urls.pyc

    | |-- view.py # 添加的视图文件

    | |-- view.pyc # 编译后的视图文件

    | |-- wsgi.py

    | `-- wsgi.pyc

    `-- manage.py

    完成后,启动 Django 开发服务器,并在浏览器访问打开浏览器并访问:

    Django 模板

    在上一章节中我们使用 django.http.HttpResponse() 来输出"Hello World!"。该方式将数据与视图混合在一起,不符合Django的MVC思想。

    本章节我们将为大家详细介绍 Django 模板的应用,模板是一个文本,用于分离文档的表现形式和内容。

    模板应用实例

    我们接着上一章节的项目将在 HelloWorld 目录底下创建 templates 目录并建立 hello.html文件,整个目录结构如下:

    HelloWorld/

    |-- HelloWorld

    | |-- __init__.py

    | |-- __init__.pyc

    | |-- settings.py

    | |-- settings.pyc

    | |-- urls.py

    | |-- urls.pyc

    | |-- view.py

    | |-- view.pyc

    | |-- wsgi.py

    | `-- wsgi.pyc

    |-- manage.py

    `-- templates

        `-- hello.html

    hello.html 文件代码如下:

    <h1>{{ hello }}</h1>

    从模板中我们知道变量使用了双括号。

    接下来我们需要向Django说明模板文件的路径,修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 为[BASE_DIR+"/templates",],如下所示:

    TEMPLATES = [

        {

            'BACKEND': 'django.template.backends.django.DjangoTemplates',

            'DIRS': [BASE_DIR+"/templates",],

            'APP_DIRS': True,

            'OPTIONS': {

                'context_processors': [

                    'django.template.context_processors.debug',

                    'django.template.context_processors.request',

                    'django.contrib.auth.context_processors.auth',

                    'django.contrib.messages.context_processors.messages',

                ],

            },

        },

    ]

    我们现在修改 view.py,增加一个新的对象,用于向模板提交数据:

    # -*- coding: utf-8 -*-

    #from django.http import HttpResponse

    from django.shortcuts import render

    def hello(request):

        context = {}

        context['hello'] = 'Hello World!'

        return render(request, 'hello.html', context)

    可以看到,我们这里使用render来替代之前使用的HttpResponse。render还使用了一个字典context作为参数。

    context 字典中元素的键值 "hello" 对应了模板中的变量 "{{ hello }}"。

    再访问访问http://192.168.45.3:8000/hello/,可以看到页面:

    这样我们就完成了使用模板来输出数据,从而实现数据与视图分离。

    接下来我们将具体介绍模板中常用的语法规则。

    Django 模板标签

    if/else 标签

    基本语法格式如下:

    {% if condition %}

         ... display

    {% endif %}

    或者:

    {% if condition1 %}

       ... display 1

    {% elif condiiton2 %}

       ... display 2

    {% else %}

       ... display 3

    {% endif %}

    根据条件判断是否输出。if/else 支持嵌套。

    {% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:

    {% if athlete_list and coach_list %}

         athletes 和 coaches 变量都是可用的。

    {% endif %}

    for 标签

    {% for %} 允许我们在一个序列上迭代。

    与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。

    每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。

    例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:

    <ul>

    {% for athlete in athlete_list %}

        <li>{{ athlete.name }}</li>

    {% endfor %}

    </ul>

    给标签增加一个 reversed 使得该列表被反向迭代:

    {% for athlete in athlete_list reversed %}

    ...

    {% endfor %}

    可以嵌套使用 {% for %} 标签:

    {% for athlete in athlete_list %}

        <h1>{{ athlete.name }}</h1>

        <ul>

        {% for sport in athlete.sports_played %}

            <li>{{ sport }}</li>

        {% endfor %}

        </ul>

    {% endfor %}

    ifequal/ifnotequal 标签

    {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。

    下面的例子比较两个模板变量 user 和 currentuser :

    {% ifequal user currentuser %}

        <h1>Welcome!</h1>

    {% endifequal %}

    和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:8

    {% ifequal section 'sitenews' %}

        <h1>Site News</h1>

    {% else %}

        <h1>No News Here</h1>

    {% endifequal %}

    注释标签

    Django 注释使用 {# #}。

    {# 这是一个注释 #}

    过滤器

    模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:

    {{ name|lower }}

    {{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。

    过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:

    {{ my_list|first|upper }}

    以上实例将第一个元素并将其转化为大写。

    有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含。 例如:

    {{ bio|truncatewords:"30" }}

    这个将显示变量 bio 的前30个词。

    其他过滤器:

    addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。

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

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

    length : 返回变量的长度。

    include 标签

    {% include %} 标签允许在模板中包含其它的模板的内容。

    下面这两个例子都包含了 nav.html 模板:

    {% include "nav.html" %}

    模板继承

    模板可以用继承的方式来实现复用。

    接下来我们先创建之前项目的 templates 目录中添加 base.html 文件,代码如下:

    <html>

      <head>

        <title>Hello World!</title>

      </head>

      <body>

        <h1>Hello World!</h1>

        {% block mainbody %}

           <p>original</p>

        {% endblock %}

      </body>

    </html>

    以上代码中,名为mainbody的block标签是可以被继承者们替换掉的部分。

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

    hello.html中继承base.html,并替换特定block,hello.html修改后的代码如下:

    {% extends "base.html" %}

    {% block mainbody %}

    <p>继承了 base.html 文件</p>

    {% endblock %}

    第一行代码说明hello.html继承了 base.html 文件。可以看到,这里相同名字的block标签用以替换base.html的相应block。

    重新访问地址http://192.168.45.3:8000/hello/,输出结果如下:

    Django 模型

    Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

    Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。

    MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例进行介绍。你可以通过本站的 MySQL 教程 了解更多Mysql的基础知识。

    数据库配置

    我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

    DATABASES = {

        'default': {

            'ENGINE': 'django.db.backends.mysql',

            'NAME': 'test',

            'USER': 'test',

            'PASSWORD': 'test123',

            'HOST':'localhost',

            'PORT':'3306',

        }

    }

    上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。

    定义模型

    创建 APP

    Django规定,如果要使用模型,必须要创建一个app。我们使用以下命令创建一个 TestModel 的 app:

    python manage.py startapp TestModel

    目录结构如下:

    HelloWorld

    |-- TestModel

    | |-- __init__.py

    | |-- admin.py

    | |-- models.py

    | |-- tests.py

    | `-- views.py

    我们修改 TestModel/models.py文件,代码如下:

    # models.py

    from django.db import models

    class Test(models.Model):

        name = models.CharField(max_length=20)

    以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

    接下来在settings.py中找到INSTALLED_APPS这一项,如下:

    INSTALLED_APPS = (

        'django.contrib.admin',

        'django.contrib.auth',

        'django.contrib.contenttypes',

        'django.contrib.sessions',

        'django.contrib.messages',

        'django.contrib.staticfiles',

        'TestModel', # 添加此项

    )

    在命令行中运行python manage.py syncdb,看到几行"Creating table…"的字样,你的数据表就创建好了。

    Creating tables ...

    ……

    Creating table TestModel_test #我们自定义的表

    ……

    表名组成结构为:app名_类名(如:TestModel_test)。

    注意:尽管我们没有在models给表设置主键,但是Django会自动添加一个id作为主键。

    数据库操作

    接下来我们在 HelloWorld 目录中添加 testdb.py 文件,并修改urls.py:

    from django.conf.urls import *

    from HelloWorld.view import hello

    from HelloWorld.testdb import testdb

    urlpatterns = patterns("",

            ('^hello/$', hello),

            ('^testdb/$', testdb),

    )

    添加数据

    添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:

    # -*- coding: utf-8 -*-

    from django.http import HttpResponse

    from TestModel.models import Test

    # 数据库操作

    def testdb(request):

     test1 = Test(name='w3cschool.cc')

     test1.save()

     return HttpResponse("<p>数据添加成功!</p>")

    访问http://192.168.45.3:8000/testdb/ 就可以看到数据添加成功的提示。

    获取数据

    Django提供了多种方式来获取数据库的内容,如下代码所示:

    # -*- coding: utf-8 -*-

    from django.http import HttpResponse

    from TestModel.models import Test

    # 数据库操作

    def testdb(request):

     # 初始化

     response = ""

     response1 = ""

     # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM

     list = Test.objects.all()

      

     # filter相当于SQL中的WHERE,可设置条件过滤结果

     response2 = Test.objects.filter(id=1) 

     # 获取单个对象

     response3 = Test.objects.get(id=1) 

     # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;

     Test.objects.order_by('name')[0:2]

     #数据排序

     Test.objects.order_by("id")

     # 上面的方法可以连锁使用

     Test.objects.filter(name="w3cschool.cc").order_by("id")

     # 输出所有数据

     for var in list:

      response1 += var.name + " "

     response = response1

     return HttpResponse("<p>" + response + "</p>")

    输出结果如下图所示:

    更新数据

    修改数据可以使用 save() 或 update():

    # -*- coding: utf-8 -*-

    from django.http import HttpResponse

    from TestModel.models import Test

    # 数据库操作

    def testdb(request):

     # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE

     test1 = Test.objects.get(id=1)

     test1.name = 'w3cschool菜鸟教程'

     test1.save()

     # 另外一种方式

     #Test.objects.filter(id=1).update(name='w3cschool菜鸟教程')

     # 修改所有的列

     # Test.objects.all().update(name='w3cschool菜鸟教程')

     return HttpResponse("<p>修改成功</p>")

    删除数据

    删除数据库中的对象只需调用该对象的delete()方法即可:

    # -*- coding: utf-8 -*-

    from django.http import HttpResponse

    from TestModel.models import Test

    # 数据库操作

    def testdb(request):

     # 删除id=1的数据

     test1 = Test.objects.get(id=1)

     test1.delete()

     # 另外一种方式

     # Test.objects.filter(id=1).delete()

     # 删除所有数据

     # Test.objects.all().delete()

     return HttpResponse("<p>删除成功</p>")

    ---恢复内容结束---

  • 相关阅读:
    LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)
    LeetCode 21. Merge Two Sorted Lists (合并两个有序链表)
    LeetCode 720. Longest Word in Dictionary (字典里最长的单词)
    LeetCode 690. Employee Importance (职员的重要值)
    LeetCode 645. Set Mismatch (集合不匹配)
    LeetCode 500. Keyboard Row (键盘行)
    LeetCode 463. Island Perimeter (岛的周长)
    115.Distinct Subsequences
    55.Jump Game
    124.Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/QI1125/p/7841611.html
Copyright © 2011-2022 走看看