Django 初识

Posted 周军豪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 初识相关的知识,希望对你有一定的参考价值。

 

 阅读目录

 

 

 

 

Django MTV模型

 

Django的MTV分别代表:

       Model(模型):负责业务对象与数据库的对象(ORM)

       Template(模版):负责如何把页面展示给用户

       View(视图):负责业务逻辑,并在适当的时候调用Model和Template

       此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

 

 

创建一个Django项目

切换到要创建的目录下
Django-admin startproject mydjango(自定义名字)

 

启动Django服务

python manage.py runserver 127.0.0.1:8000(可以不写地址,有默认)

 

在mysite下创建应用app

python manage.py startapp myapp

 

 

同步更改数据库表或字段

\'\'\'
    python manage.py syncdb
     
    注意:Django 1.7.1 及以上的版本需要用以下命令
    python manage.py makemigrations
    python manage.py migrate
    
\'\'\'

 

这种方法可以创建表,当你在models.py中新增了类时,运行它就可以自动在数据库中创建表了,不用手动创建。

 

清空数据库

python manage.py flush

 

 此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。

 

创建超级管理员

\'\'\'
    python manage.py createsuperuser
     
    # 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
     
    # 修改 用户密码可以用:
    python manage.py changepassword username
    
\'\'\'

 

 

 

Django项目环境终端

python manage.py shell

 

这个命令和 直接运行 python 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据的测试非常方便。

 

ython manage.py dbshell

 

Django 会自动进入在settings.py中设置的数据库,如果是 mysql 或 postgreSQL,会要求输入数据库用户密码。

在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。

 

更多命令

    python manage.py

 

查看所有的命令,忘记子名称的时候特别有用。

 

 

 

目录结构

 

 

    - 下载安装 pip install django
    - 创建项目 django-admin startproject mysite
               PyCharm创建项目 --> File->new project -> 左侧选Django ->右侧选项目存放路径
    - 目录结构
        -mysite
            -mysite
                -urls.py  配置对应关系 URL-->函数
                -settings.py 配置文件
                -wsgi.py  socketserver
                -views.py 自己写的函数统一放到这里
                __init__.py
            -templates  存放模板文件的(html文件)
                -index.html
                -class_list.html
            -static
                -bootstrap
                    -css
                        -bootstrap.min.css
                    -fonts
                    -js
                -jQuery.3.2.1.min.js
            -manage.py   管理你Django项目的(有很多命令)
                         python manage.py runserver IP:PORT

 

 

 回到顶部

修改配置文件

 

模版配置:

 

静态文件配置:

STATIC_URL = \'/static/\'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"), ] # 静态文件存放位置

 

 

数据库配置

DATABASES = {

    \'default\': {

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

        \'NAME\': \'bookmanage\',    #你的数据库名称

        \'USER\': \'root\',   #你的数据库用户名

        \'PASSWORD\': \'123\', #你的数据库密码

        \'HOST\': \'\', #你的数据库主机,留空默认为localhost

        \'PORT\': \'3306\', #你的数据库端口

    }

}
View Code

 在app目录下的init文件里写入

import pymysql

pymysql.install_as_mysqldb

  

 

 配置app

 

 

 新手三件套

 

from django.shortcuts import HttpResponse, render, redirect
    1. HttpResponse(\'ok\') #直接返回文字
    2. render 渲染
        1. render(request, "xx.html")
        2. render(request, "xx.html", {"num": 123,\'list\':[1,2,3]})  #给以给模板里的变量传值
    3. redirect(\'/login/\')  跳转到xx

 

 回到顶部

视图层之路由配置系统(views)

 

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

    \'\'\'
    
    urlpatterns = [
         url(正则表达式, views视图函数,参数,别名),
]


参数说明:

    一个正则表达式字符串
    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    可选的要传递给视图函数的默认参数(字典形式)
    一个可选的name参数

    \'\'\'

 

 

 

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),
]
\'\'\'
    NOTE:
一旦匹配成功则不再继续
若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
每个正则表达式前面的\'r\' 是可选的但是建议加上。

一些请求的例子:

    /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
    /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。
    /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数
                       views.month_archive(request, \'2005\', \'03\')。
    \'\'\'

 

 

2.有名分组 ?p<>

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),
]

在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。捕获的参数永远是字符串

这个实现与前面的示例完全相同,只有一个细微的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。例如:

    /articles/2005/03/    
    请求将调用views.month_archive(request, year=\'2005\', month=\'03\')函数
    /articles/2003/03/03/ 
    请求将调用函数views.article_detail(request, year=\'2003\', month=\'03\', day=\'03\')。

 

 

 

3.指定试图参数的默认值

 

有一个方便的小技巧是指定视图参数的默认值。 下面是一个URLconf 和视图的示例:

# 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"):

    ...

 

在上面的例子中,两个URL模式指向同一个视图views.page —— 但是第一个模式不会从URL 中捕获任何值。如果第一个模式匹配,page() 函数将使用num参数的默认值"1"。

如果第二个模式匹配,page() 将使用正则表达式捕获的num 值。

 

 

4.路由分发

#At any point, your urlpatterns can “include” other URLconf modules. This
#essentially “roots” a set of URLs below other ones.

#For example, here’s an excerpt of the URLconf for the Django website itself.
#It includes a number of other URLconfs:


from django.conf.urls import include, url

urlpatterns = [
   url(r\'^admin/\', admin.site.urls),
   url(r\'^blog/\', include(\'blog.urls\')),
]

 

url(r\'^app02/\', include("app02.urls",namespace="app02")),

#include()有三个参数,第一个是分发的位置,
   namesoace是命名空间,在不同app的urls里别名重复时可使用reverse("命名空间:别名")

  

 

5.传递额外的选项给视图函数(了解)

 

URLconfs 具有一个钩子,让你传递一个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\')

这个技术在Syndication 框架中使用,来传递元数据和选项给视图。

 

 

6. URL 的反向解析 起别名

urlpatterns = [
    url(r\'^articls/2004/$\', views.archive,name=\'laogou\'),
]



<form action="{% url \'laogou\' %}" method="post">  提交的时候{% url \'laogou\' %} 就变成了articls/2004/

 

反向解析在视图函数中的用法

from django.core.urlresolvers import reverse

def index(request):

    return HttpResponse(reverse("app02:index"))

#app02是命名空间namespace名字,index是别名,
#使用reverser函数根据别名反向解析url

  

 

 回到顶部

 模版层

 

 

 模板语言

 

模板语言for循环:
    {% for teacher in teacher_list %}
      
{% empty %} teacher_list 为空要做的事儿
{
% endfor %} {{ 变量名 }} if判断 {% if %}    {% else %} {% endif %}


引用小组件
-{% include \'nav.html\' %}
继承母板
-{% extends \'base.html\' %}

替换模版
  -{% block 名字 %}
    {% endblock %}

别名
   - action="{% url \'别名\' %}"

引入静态文件
 {% load static %}

<link rel="stylesheet" href="{% static \'css/style.css\' %}" type="text/css" media="all">

 

模版语言变量取值  可深度查询  用句点符

<h4>{{s}}</h4>
<h4>列表:{{ l.0 }}</h4>
<h4>列表:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>
<h4>类对象列表:{{ person_list.0.name }}</h4>


注意:句点符也可以用来引用对象的方法(无参数方法)。
<h4>字典:{{ dic.name.upper }}</h4>

 

 

模版之标签

 

for标签

遍历每一个元素:

{% for person in person_list %}
    <p>{{ person.name }}</p>
{% endfor %}

可以利用{% for obj in list reversed %}反向完成循环。

遍历一个字典:

{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}

注:循环序号可以通过{{forloop}}显示  

forloop.counter         The current iteration of the loop (1-indexed)
forloop.counter0    The current iteration of the loop (0-indexed)
forloop.revcounter  The number of iterations from the end of the loop (1-indexed)
forloop.revcounter0 The number of iterations from the end of the loop (0-indexed)
forloop.first           True if this is the first time through the loop
forloop.last            True if this is the last time through the loop

 

 

for ... empty

for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}

 

 

if 标签

{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}

 

 

with

使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的

例如:  把一个变量复制给total,在下面就直接可以用total代替  business.employees.count 来用了

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

 

 

csrf_token

这个标签用于跨站请求伪造保护

 

 

 回到顶部

模版之过滤器

 

 

参数

{{obj|filter__name:参数}}

 

 

default

如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:

    {{ value|default:"nothing" }}

 

length

返回值的长度。它对字符串和列表都起作用。例如:

{{ value|length }}

 

filesizeformat

将值格式化为一个 “人类可读的” 文件尺寸 (例如 \'13 KB\'\'4.1 MB\'\'102 bytes\', 等等)。例如:

{{ value|filesizeformat }}

 

如果 value 是 123456789,输出将会是 117.7 MB

date

如果 value=datetime.datetime.now()

{{ value|date:"Y-m-d" }}  

 

slice

如果 value="hello world"

{{ value|slice:"2:-1" }}

 

truncatechars

如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

参数:要截断的字符数

例如:

{{ value|truncatechars:9 }}

 

如果value“Joel 是 >,输出将为“Joel i ...”

safe

 

Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:

value="<a href="">点击</a>"

{{ value|safe}}

 

在 py文件中使用:

from django.utils.safestring import mark_safe

mark_safe("<a href=\'%s\'>编辑</a>" % path)

  

 

更多详见文档...

 

 

模版继承

 

Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

通过从下面这个例子开始,可以容易的理解模版继承:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{%/span> endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>
View Code

这个模版,我们把它叫作 base.html, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks。

在这个例子中, block 标签定义了三个可以被子模版内容填充的block。 block 告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置。

子模版可能看起来是这样的:

{% extends "base.html" %}
 
{% block title %}My amazing blog{% endblock %}
 
{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。

那时,模版引擎将注意到 base.html 中的三个 block 标签,并用子模版中的内容来替换这些block。根据 blog_entries 的值,输出可能看起来是这样的:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>My amazing blog</title>
</head>
 
<body>
    <div id="sidebar">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
    </div>
 
    <div id="content">
        <h2>Entry one</h2>
        <p>This is my first entry.</p>
 
        <h2>Entry two</h2>
        <p>This is my second entry.</p>
    </div>
</body>
</html>
以上是关于Django 初识的主要内容,如果未能解决你的问题,请参考以下文章

初识django安装

Django快速开发实战初识Django

Django快速开发实战初识Django

Django学习手册 - 初识django

Java初识方法

python——初识django的template