• Django


    (一).简介

    简介就不多说了,网上的内容一大堆。总结来说,django是走大而全的路线,写项目超级快,几乎什么都为你考虑到了,你就乖乖照着它的格式来写就行了。

    这里来一些基本认知:

    web应用框架(web application framework)是一种开发框架,用来支持动态网站、网络应用程序以及网络服务的开发。

    http服务器:用来接受用户的请求,并将请求转发给web应用框架进行处理。web应用框架处理完以后再发送给http服务器,http服务器再返回给用户。

    但是,项目真要做大了,django扩展方面的问题就来了。庞大就会导致臃肿,不易于扩展。不过,就目前学习阶段而言,根本不用考虑这么多。

    (二).使用哪个版本?

    学习和开发项目中,一定会使用稳定的版本,也就是LTS(long term support)

    目前学习用的是django1.11.7。所以说,在pip的时候要指定一下版本。即:pip install django==1.11.7

    (三).注意点

    如果要使用django2.x版本进行项目,在一些版本较老的ubuntu server上可能会安装不上。原因多数是pip的版本过低。

    那么先进行pip升级,在Ubuntu中的命令:sudo pip3 install --upgrade pip

    然后再pip安装django模块。

    一、创建一个django项目

    绝大部分的项目都是在Linux上跑的,所以,项目就要放在Linux中。

    (一).准备好虚拟环境

    进行项目作业的时候,每个项目所需要的依赖包、环境变量,都有可能不一样。你要是在Linux的全局环境中改这个改那个(要知道Linux中软件之间的相互依赖关系是比较复杂的),要是一个不小心把全局环境搞崩了(你还不知道是什么时候怎么把哪个依赖给搞崩的),然后你修复起来也会感觉很崩溃。

    比如一个django项目是需要1.11的版本,另一个django项目要2.0的版本。两个项目要是同时开搞,难道你在全局环境中来回地pip install django==version_number?pip uninstall django?那么,虚拟环境就完美地解决了这个问题。而且很多django核心开发者也推荐在虚拟环境中进行项目作业。

    每个虚拟环境都是独立自主的,多个虚拟环境之间完全是隔离开的、互不相关。

    (1).创建虚拟环境

    可参考下列步骤:

    # 事先要安装好python3.6.x
    # 并将创好这两个的软链到 /usr/bin/
    
    # 没有pip3的话 先执行下面这条命令
    sudo apt-get install python3-pip
    # 然后必须更新
    sudo pip3 install --upgrade pip
    
    sudo pip3 install virtualenv
    
    sudo pip3 install virtualenvwrapper  # 必须要装
    
    mkdir ~/.virtualenvs  # 创建文件夹
    
    export WORKON_HOME=~/.virtualenvs
    
    VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'
    
    source /usr/local/bin/virtualenvwrapper.sh
    
    source ~/.bashrc
    
    cd .virtualenvs/  # 我自己想要在这个目录下建虚拟环境,所以cd了
    
    mkvirtualenv venv_djpy
    
    virtualenv venv_djpy
    
    试着workon看一下
    View Code

    (2).遇上workon: command not found怎么办?

    # 需要编辑这个配置文件
    vim ~/.bashrc
    
    # 把下面三行代码放进这个配置文件中
    export WORKON_HOME=~/.virtualenvs
    VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'
    source /usr/local/bin/virtualenvwrapper.sh
    # 保存并退出 (Esc -> : -> wq -> 回车)
    
    # 重启配置
    source ~/.bashrc
    View Code

    (二).使用命令行的方式创建一个django项目(通用操作,必须得学会)

    (1).进入一个python3的虚拟环境。

    (2).cd到你放项目的文件夹中。

    (3).输入命令:django-admin startproject 项目的名字。

    (4).在本地环境中,建好一个空文件夹,用于等会代码同步时从虚拟机中下载来的代码有地方可以放。

    (5).pycharm进行代码同步设置,然后从Linux上把代码下载到本地。

    注意:代码同步建议用"Ctrl+s"这个选项。(Always)自动上传代码,有很小的几率会使Linux系统崩溃。

    (三).使用pycharm的方式(目前本人使用的pycharm版本)

    (四).何为app

    一个项目由有许许多多的模块构成,这些模块可以理解成app

    (五).创建一个新的app

    建完了项目,就可以在项目中新建app了。

    (1).cd到"manage.py"这个文件所在的目录

    (2).敲命令:python manage.py startapp <app_name>

    (3)."应用程序"对应于"application","应用"对应于"app"。在一般的Web开发中,这二者几乎没什么区别。但是在Django中,二者有一个明显的区别:application是指一个完整的Web程序,而app是指一个可复用的包,可以“插入”其他Django应用程序中。

    (六).注册app

    新建一个app之后,必须要把它的名字注册到"settings.py"的"INSTALLED_APPS"中,不然这个app下面的子路由、模板、自定义过滤器等等,系统都找不到!

    (七).修改时区

    django1.11.7中,使用的时区是"UTC",也就是"世界标准时间"。目前国际通讯系统,如卫星、航空、GPS等等,都采用UTC时间。但其时区上,与GTM一致。

    我国在时区上属于东八区,也就是GTM+8.

    想要获取到本地的时间,就需要在"settings.py"中修改"TIME_ZONE"这个属性。TIME_ZONE = "UTC" 改成 TIME_ZONE = "Asia/Shanghai"

    二、Django目录简介

    外层的tk_dj/根目录是项目的容器。这个目录的名称对Django没有什么作用,你可以根据喜好重命名。

    manage.py:管理django项目的工具,一个命令行工具。

    __inti__.py:告诉解释器,这个目录是python包。

    settings.py:配置文件。包含数据库信息,调试标识,静态文件等。

    urls.py:django项目总url声明(总路由)。

    wsgi.py:部署项目会用到。

    三、开启服务器

    别忘了开启服务!否则连你自己都访问不到网站。PS:我就犯过这SB错误,写完代码,直接去浏览器刷新了,刷来刷去没有页面。一看,服务没开启来 [/笑哭]~

    (一).第一步(重中之重)

    打开settings.py,把ALLOWED_HOSTS = [] 改成 ALLOWED_HOSTS = ["*"]

    项目是部署在Linux上的,只有这样写才可以让windows上的浏览器访问到Linux服务器上的项目。

    (二).Linux上的操作步骤

    (1).在Linux中,进入"manage.py"这个文件所在的目录。

    (2).输入代码:python manage.py runserver 0:8000

    其中,0是"0.0.0.0"的缩写,允许所有的IP都能够访问。然后,后面加冒号,再跟上端口号。

    (3).去浏览器的地址栏中,敲入"IP:端口",就可以访问了。

    注意:如果你的虚拟机是VMware,那么几乎不需要端口转发,在浏览器的地址栏中直接键入完整的IP。

    我用的是VMware,不知道端口转发该怎么搞 [/糗]

    (三).pycharm中的操作步骤

    (四).端口被占用

    (1).如果在pycharm中看到开了两个,直接关掉其中一个。

    (2).看不到的话,去Linux中杀进程。

    先敲入:ps -aux | grep manage 看到有哪些进程。

    然后统统杀之:kill -s 9 进程ID

    四、最基本的视图函数和路由设置

    (一).编写视图函数

    # hello_django/views.py
    from django.http import HttpResponse
    
    def index(request):
        return HttpResponse('hello django!')
    View Code

    (二).设置路由

    # hello_django/urls.py
    from django.conf.urls import url
    from django.contrib import admin
    from . import views
    
    urlpatterns = [
        url(r'^admin/$', admin.site.urls),
        url(r'^hello/$', views.index),
    ]
    View Code

    备注。脱字符:"^",是以什么开头。美元符:"$",是以什么结束。

    五、urls.py路由用法

    (一).URL概念

    URL(uniform resource locator)统一资源定位符。说白了,就是网址!

    (二).URL格式

    例如:https://www.google.com/

    (1).格式:schema://host[:port#]/path/.../[?query-string][#anchor]

    (2).schema:指定使用的协议(例如:http://,https://,ftp://)

    (3).host:http服务器的IP地址或者域名

    (4).port:端口号,http默认是80端口

    (5).path:访问资源的路径

    (6).query-string:发送给http服务器的数据

    (7).anchor:锚点

    (三).urls.py的作用

    本质上就是视图函数的映射列表。告诉django,哪个url调用哪段代码。

    (四).url解析过程

    (1).django传给url路由要处理的地址,该地址是被去掉端口号之后的第一个"/"的剩余部分。

    例如:http://127.0.0.1:8000/hello/

    经处理后的剩余部分就是:hello/

    (2).django会拿着这个剩余部分的地址,在urlpatterns这个列表里,从上往下,依次进行正则匹配。

    (3).django将会去调用第一个匹配到的视图。

    (五).url示例:

    # hello_django/urls.py:
    from django.conf.urls import include,url
    from django.contrib import admin
    from books import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^hello/python/$', views.hello_python),
        url(r'^hello/php/$', views.hello_php),
        url(r'^hello/([a-z]+)/$',views.hello_course),
        url(r'^add/(d+)/(d+)/$', views.add),
        url(r'^hello/(?P<name>w+)/(?P<num>d+)$',views.hello_django),
    ]
    View Code
    # books/views.py
    from django.http import HttpResponse
    
    def hello_python(request):
        return HttpResponse('Hello python!')
    
    def hello_php(request):
        return HttpResponse('Hello php!')
    
    def hello_course(request, course):
        return HttpResponse('Hello %s' % course)
    
    def add(request,a,b):
        c = int(a)+int(b)
        return HttpResponse(str(c))
    
    def hello_django(request, name, num):
        return HttpResponse('Hello %s %s' % (name, num))
    View Code

    (1).位置参数:示例中的 r"^hello/([a-z]+)/$" 以及 r"^hello/(d+)/(d+)/$"

    在url函数中,正则表达式使用括号"()"进行捕获参数。

    (2).关键字参数:示例中的 r"^hello/(?P<name>w+)/(?P<num>d+)/$"

    在url函数中,正则表达式使用(?P<keyword>)进行捕获参数。

    注意:keyword的命名,必须与它视图函数中的参数名一样,不然就会报错!参数个数要一样,名字也要一样!

    (3).其他注意点:

    参数类型是字符串类型,所以如果在视图中要进行数值运算,需要强转一下。

    六、include

    (一).作用

    方便管理项目。一个项目有一个总urls.py,每个app中,也建议需要有它自己的urls.py(可以称呼“子url”)。只是需要在总urls.py中,使用include()函数进行注册。

    如果一股脑,把所有app的url都放进总urls.py中。先别说app多了,视图一多,就容易搞混了。

    (二).示例

    #hello_django/urls.py     主url文件
    from django.conf.urls import include,url
    from django.contrib import admin
    from .import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^books/',include('books.urls')),
    ]
    View Code
    #books/urls.py    APP books里面的URL文件
    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r'^$',views.index),
        url(r'article/$', views.article),
    ]
    View Code
    #book/view.py           APP books里面的view文件
    from django.http import HttpResponse
    
    def index(request):
        return HttpResponse('这是首页')
    
    def article(request,):
        return HttpResponse('这是文章的首页')
    View Code

    (三).注意事项

    (1).总urls.py中,开头不要加斜杠"/"。因为django已经给域名后面加了一个斜杠,你要是开头也加个斜杠,url一拼接,就匹配不到了。直接404

    (2).总urls.py中,结尾不要加美元符"$"。美元符的意义是:以什么结束。总url都结束了,那么子url中的urlpatterns还匹配个球呢

    (3).总urls.py中,结尾要加斜杠"/"。

    (4).子urls.py中,开头不要加斜杠"/"。同理于(1).

    (5).子urls.py中,结尾可以接美元符"$"。

    七、kwargs的作用

    django.conf.urls.url()函数可以接收第三个可选参数,它必须是一个字典,表示想要传递给视图函数的额外关键字参数。

    (一) .示例

    #hello_django/urls.py     主url文件
    from django.conf.urls import include,url
    from django.contrib import admin
    from .import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^books/',include('books.urls'),{'switch':'true'}),
    ]
    View Code
    # book/view.py      APP books里面的view文件
    from django.http import HttpResponse
    import datetime
    
    def index(request,**kwargs):
        if kwargs.get('switch') == 'true':
            print(datetime.datetime.now())
        return HttpResponse('<h1>这是首页</h1>')
    View Code

    此示例中,kwargs起到了“开关的作用”:当switch为"true"这个值,在控制台打印时间(要显示本地时间需要去setting.py中设置下TIME_ZONE这个属性)。当switch不为"true"这个值,就不会打印出时间。

    八、name的作用

    name参数可以给url取一个名字。通过给url取名字,以后在这个views或者模版中使用这个url,就只需要通过这个名字就可以了。

    一般用于模版。也可以使用reverse进行页面重定向。

    (一).示例

    # book/url.py    APP books里面的URL文件
    from django.conf.urls import url
    from . import views
    
    urlpatterns =[
        url(r'^$',views.index),
        url(r'article/$', views.article,name='books_article'),
        url(r'^(?P<books>w+)/$',views.book_list,name='books_lists'),
        url(r'^article_new/$', views.article_new,name='books_article_new'),
    ]
    View Code
    # book/views.py   APP book里面的view文件
    from django.shortcuts import render,reverse,redirect
    from django.http import HttpResponse
    # Create your views here.
    
    def article(request,**kwargs):
        if kwargs.get('switch') == 'true':
            return redirect(reverse('book_article_new'))
        return HttpResponse('这是文章首页')
    
    def article_new(request,**kwargs):
        return HttpResponse('这是新的文章首页')
    View Code

    九、模板渲染方式

    Django模板是一些文本字符串,作用是把文档的表现与数据区分开。模板定义一些占位符和基本的逻辑(模板标签),规定如何显示文档。通常,模板用于生成HTML

    (一).setting.py中模版路径配置

    用命令行建项目,没有"templates"这个文件夹。而这个文件夹是用来存放html页面的。

    既然没有,那么就自己手动在项目的根目录中创建一个名为"templates"的文件夹(名字切记不要打错了)。

    然后打开"settings.py",把TEMPLATES中的 'DIRS':[] 改成 'DIRS':[os.path.join(BASE_DIR, "templates")]

    (二).在"templates"中,新建html文件

    在"templates"中,新建一个与app同名的文件夹,再在其里面新建html文件。这样做的好处是,自己不会搞混。页面多了,如果不归类,马上就会把自己搞晕了。

    (三).使用render()进行渲染

    # books/views.py
    from django.shortcuts import render
    
    def index_3(request):
        return render(request,'index.html')
    View Code

    注意:render()函数中的第一个参数,必须是request这个请求对象。

    (四).去urls.py中进行路由注册

    十、模板变量

    (一)语法

    两对花括号包围的文本,{{variable_name}} 意思是:把指定变量的值插入这里

    Ps:变量名的命名规则与python一样。

    (二).切换模板语言

    这样设置后,只需要写一个关键字,然后按tab键,pycharm就会自动帮你补全,省心了很多很多。

    (三).示例

    {# /templates/books/index.html #}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body>
        这个变量是字符串对象:{{ books_name}}<br>
        这个变量是函数对象:{{ hello}}<br>
        这个变量是类方法对象:{{ fruits_say}}<br>
        这个变量是类对象:{{ fruits}}<br>
        这个变量是类对象,访问类对象的属性:{{ fruits.name}}<br>
        这个变量是类对象,访问类对象的方法:{{ fruits.say}}<br>
        这个变量是列表对象{{ list }}<br>
        这个变量是列表对象,访问列表的元素{{ list.1 }}<br>
        这个变量是字典对象{{ dict }}<br>
        这个变量是字典对象,访问字典的键{{ dict.a }}<br>
    </body>
    </html>
    View Code
    # books/views.py
    from django.shortcuts import render
    
    
    def hello():
        return 'django'
    
    
    class Fruits:
        def __init__(self, name, color):
            self.name = name
            self.color = color
    
        def say(self):
            return 'HAHAHAHA'
    
    
    ap = Fruits('apple', 'red')
    ls = ['x', 'y', 'z']
    dc = {'a': 1, 'b': 2}
    
    
    def index_5(request):
        return render(
            request,
            'books/index.html',
            context={'books_name': 'python',  # 字符串
                     'hello': hello,  # 函数
                     'fruits_say': ap.say,  # 方法
                     'fruits': ap,  # 类对象
                     'list': ls,  # 列表
                     'dict': dc,  # 字典
                     }
        )
    View Code

    (四).变量和查找

    点"."在模板中表示查找。模板看见这个点".",它会按:字典查找、属性查找、列表索引的进行查找。

    (五).不要与python或django关键字重名

    比如,你来了一个变量:{{data}} 这个变量是一个字典。那么访问data.itmes的时候,将会去访问这个变量中,名为"items"的键。而不是访问python字典中的items()方法。

    十一、模板过滤器

    (一).语法

    例:{{fruits|lower}}

    管道符"|"进行链式调用,去实现某个功能。

    此例中,把fruits对应的字符串,全部转成小写。

    (二).作用

    对变量进行过滤,把处理后的结果展示出来。就像上例,把字符串全部转成了小写。

    (三).过滤器可以使用参数

    在过滤器的名称后面跟上冒号":"再加参数。比如,要把一个字符串中所有的空格去掉,则可以使用"cut"过滤器。

    {{fruits|cut:' '}}

    注意:冒号和参数之间不能有任何空格,一定要紧挨着!

    (四).常用的过滤器

    1、add :字符串相加,数字相加,列表相加,如果失败,将会返回一个空字符串。
    2、default:提供一个默认值,在这个值被django认为是False的时候使用。比如:空字符串、None。区别于default_if_none,这个只有在变量为None的时候才使用默认值。
    3、first:返回列表中的第一个值。
    4、last:返回列表中的最后一个值。
    5、date:格式化日期和时间。
    6、time:格式化时间。
    7、join:跟python中的join一样的用法。
    8、length:返回字符串或者是数组的长度。
    9、length_is:字符串或者是数组的长度是否是指定的值。
    10、lower:把所有字符串都编程小写。
    11、truncatechars:根据后面给的参数,截断字符,如果超过了用…表示。
    12、truncatewords:同truncatechars,这个是以一个单词为单位进行截断。
    以上两个有xxx_html类型的,针对html,截断标签中的字符,而不会截断标签。
    13、capfirst:首字母大写。
    14、slice:切割列表。用法跟python中的切片操作是一样的,区间是前闭合后开放。
    15、striptags:去掉所有的html标签。
    16、safe:关闭变量的自动转义
    17、floatformat:浮点数格式化。
    View Code

    (五).date和time过滤格式

    Y:四位数的年。如:1999
    y:两位数的年。如:99
    m:两位数的月。如:01,09
    n:一位数的月。如:1,9,12
    d:两位数的日。如:01,09,31
    j:一位数的日。如:1,9,31
    g:12小时制的一位数的小时。如:1,9,12
    G:24小时制的一位数小时。如:0,8,23
    h:12小时制的两位数的小时。如:01,09,12
    H:24小时制的两位数的小时。如:01,13,24
    i:分钟。从00-59
    s:秒。从00-59
    View Code

    (六).示例

    {# /templates/movie/index22.html #}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>home</title>
    </head>
    <body>
        这是没做处理的变量:{{ test }}<br>
        这是设置了默认值的变量:{{ xx|default:'xxxxxx' }}<br>
        这是设置了只有为None时才使用默认值的变量:{{ xx|default_if_none:'xxxxxx' }}<br>
        这是变为小写后的变量:{{ test|lower }}<br>
        这是先变成小写再将首字母大写后的变量:{{ test|lower|capfirst}}<br>
        这是两个数字变量相加:{{ num1|add:num2 }}<br>
        这是两个字符串变量相加:{{ test|add:xx }}<br>
        这是列表变量的第一个元素:{{ list|first }}<br>
        这是列表变量的最后一个元素:{{ list|last }}<br>
        这是默认的data日期时间格式:{{ now|date }}<br>
        这是默认的time时间格式:{{ now|time }}<br>
        这是data过滤器的年月日24小时制时间格式:{{ now|date:'Y/m/d/H:i:s ' }}<br>
        这是time过滤器的年月日12小时制时间格式:{{ now|time:'h:i:s ' }}<br>
        这是字符串的join方法:{{ ls|join:'xxx' }}<br>
        这是字符串的长度方法:{{ test|length }}<br>
        这是列表的长度是否长度为4:{{ list|length_is:4 }}<br>
        这是字符串只显示4个字符,其余省略(占3位):{{ test|truncatechars:7 }}<br>
        这是字符串只显示2个单词,其余省略(不占位):{{ test|truncatewords:2 }}<br>
        这是字符串切片:{{ test|slice:'1:4' }}<br>
        这是列表切片:{{ list|slice:':2' }}<br>
        这是含html标签的字符串:{{ html }}<br>
        这是去掉字符串中的html标签:{{ html|striptags }}<br>
        这是关掉自动转义,使字符串中html标签生效:{{ html|safe }}<br>
        这是没做处理的小数:{{ float }}<br>
        这是保留了一位小数:{{ float|floatformat }}<br>
        这是保留了两位位小数:{{ float|floatformat:'2' }}<br>  
    </body>
    </html>
    View Code
    # movie/views.py
    from django.shortcuts import render
    from datetime import datetime
    
    ls = ['x', 'y', 'z']
    
    
    def hello(request):
        test = 'THIS IS A LIST!'
        return render(
            request,
            'movie/home.html',
            context={'test': test,
                     'xx': '',
                     'num1': 1,
                     'num2': 2,
                     'list': ls,
                     'now': datetime.now,
                     'html': '<h1>hello django!!!</h1>',
                     'float': 3.1415926,
                     }
        )
    View Code

    十二、模板标签

    (一).语法

    一对花括号和百分号包围的文本,{% if xxx %})是模板标签。标签的定义相当宽泛:只要能让模板系统“做些事”的就是标签。

    实际敲代码的时候,就是在html页面上写python代码(语法非常接近python)。一个标签可以输出内容,作为控制、循环结构,甚至可以访问其他的模板标签。

    注意事项:标签要记得关闭!如:{%tag%}{%endtag%} Ps:就像大多数的html代码那样,要关闭标签!

    (一).常用标签

    (1)if/elif/else:可以使用and/or/in/not/==/!=/<=/>=,来进行判断。ifequal/ifnotequal
    (2)forin…:跟python中的for…in…是一样的用法。
    forloop.counter:当前迭代的次数,下标从1开始。
    forloop.counter0:当前迭代的次数,下标从0开始。
    forloop.revcounter:跟forloop.counter一样,下标从大到小。
    forloop.revcounter0:跟forloop.counter0一样,下标从大到小。
    forloop.first:返回bool类型,如果是第一次迭代,返回true,否则返回false。
    forloop.last:返回bool类型,如果是最后一次迭代,返回True,否则返回False。
    forloop.parentloop:如果发生多层for循环嵌套,那么这个变量返回的是上一层的for
    (3)forin…empty…:如果没有数据,跳转到empty中。
    (4)load:加载第三方标签。最常用的是{%load static%}
    (5)url:返回一个命名了的URL的绝对路径。
    (6)with:缓存一个变量。
    (7)autoescape:开启和关闭自动转义。
    View Code

    (二).示例

    # views.py
    from django.shortcuts import render
    
    
    def index33(request, name):
        return render(
            request,
            'book/index33.html',
            context={'test_name': name,
                     'list': ls,
                     'dict': dc,
                     'html': '<h1>hello django</h1>',
                     }
        )
    View Code
    {# book/index33.html #}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>hello</title>
    </head>
    <body>
        {% if name == "python" %}
            这是python页面哈哈哈
        {% elif name == "django"%}
            这是django的页面嘿嘿嘿
        {% else %}
            呵呵呵 是{{ name }}的呢....
        {% endif %}
    </body>
    </html>
    View Code
    # for的使用
    {% for i in list %}
        {% if forloop.counter0 == 0 %}
            <li>这是一个值:{{ i }}</li>
        {% else %}
               <li>{{ i }}</li>
        {% endif %}
    {% endfor %}
    View Code
    # url 页面转换
    
    # --------------url.py--------------
    urlpatterns = [
        url(r'^test/$',views.test,name='test'),
        url(r'^index/([a-z]+)/$',views.index33),
        url(r'^new/(?P<aaa>w+)/$',views.new,name='book_new'),
    ]
    
    # --------------hello.html--------------
    <a href="/book/test">test测试</a> <br>
    <a href={% url 'test_alias' %}> test 页面</a>
    <a href="{% url 'book_new' 'django' %}">new传参数</a>  <br>
    
    # --------------views.py--------------
    def test(request):
        return HttpResponse('test page!!!!!!!')
    def new(request,aaa):
        return HttpResponse('这是新的页面')
    View Code
    # with的使用
    {% with test_name as tn  %}
        11111{{ tn }} <br>
        22222 {{ tn }} <br>
    {% endwith %}
    View Code
    # autoescape的使用
    原始的: {{ html }} <br>
    过滤器方式: {{ html |safe }} <br>
    标签方式:
    {% autoescape off %}
        {{ html }} <br>
    {% endautoescape %}
    View Code

    十三、模板继承与引用

    模板继承可以让你创建一个基本的架构

    (一).示例

    {# templates/music/base.html#}   
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}这是默认标题{% endblock %}</title>
    </head>
    <body>
    {% block content %}
        这是默认内容
    {% endblock %}
    <br>
    {% block demo %}
        这是默认演示
    {% endblock %}
    </body>
    </html>
    View Code
    {# templates/music/ss.html#}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>内容</title>
    </head>
    <body>
    Python学院 web开发django班
    </body>
    </html>
    View Code
    {# templates/music/index.html #}
    {% extends 'music/base.html' %}
    {% block title %}music主页{% endblock %}
    {% block content %}
        这句是通过block.super继承父类的:{{ block.super }}<br>
        这是子模板自己的内容:没有写block就不会显示
    {% endblock %}
    {% block demo %}
        这是通过include引用的其他模板的内容:{% include 'music/ss.html' %}
    {% endblock %}
    View Code

    二).引用

    include标签可以包含一个html模板到当前模板中,include标签是把html模板在此处展开。

    (三).注意点

    (1).{%extends%}标签必须在模板的第一行。(放在<!DOCUMENT type>上面一行)

    (2).子模板中的所有内容,必须出现在父模板定义好的{%block%}标签中,否则django不会渲染。

    (3).如果在某个block中要使用父模板的内容,使用block.super获取。(可以理解成:super().__init__())

    十四、模板加载静态文件

    (一).在"settings.py"中添加"STATICFILES_DIRS",设置静态文件目录的路径。(同理于templates)

    (二).示例

    # /static/js/myjs.js
    alert('hahahaha');
    
    # --------------------------------
    
    # /static/css/mystyle.css
    body{
        background: skyblue;
    }
    #---------------------------------
    
    # /static/image/myimage.jpg
    ##存入图片
    View Code
    {# /templates/index.html#}
    {% load static %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>静态文件加载</title>
    </head>
    <body>
    <link rel="stylesheet" href="{% static 'css/mystyle.css' %}">
    <script src="{% static 'js/myjs.js' %}"></script>
    图片:
    <img src="{% static 'img/myimage.jpg' %}" alt="">
    </body>
    </html>
    View Code

    十五、自定义过滤器

    django已经提供了很多的内置过滤器,不过总有不够用的时候,那么就需要你自己定来定义过滤器。

    自定义过滤器就是自己编写带有参数的python函数。

    (一).建一个存放自定义过滤器的python包(实则就是一个文件夹)

    这个python包的命名必须是"templatetags",小写且一个字都不能改。

    目录结构如下图:

    "__init__.py"表示这是一个python包,可以用来引入,必须要有"__init__.py"这个名字的py文件。

    过滤器实则就是一个py文件,在模板中的引入语法:{% load myself_filters %}

    (二).实例化注册类

    所有的自定义过滤器、自定义标签,都必须在这个自定义的py文件中进行注册。这样才能在django模板中可以被使用。

    # templatetags/myself_filters.py
    
    from django import template
    
    register = template.Library()
    View Code

    (三).示例

    def mycut(value, arg):
        """字符替换的自定义过滤器"""
        return value.replace(arg, '')
    View Code
    {# 在模板页面上的使用 #}
    {{ somevariable|mycut:"0" }}
    View Code
    # 注册自定义过滤器
    @register.filter(name='mycut')  # 不指定name,函数名就是过滤器的名字
    def mycut(value, arg):
        return value.replace(arg, '')
    View Code

    补充:

    (一).遇到需要django支持的时候

  • 相关阅读:
    3B1B微分方程系列笔记(一)
    洛谷P1127 【词链】欧拉通路,欧拉回路+dfs
    龟速乘,快速乘法
    单调队列优化O(N)建BST P1377 [TJOI2011]树的序
    洛谷 p4302的dp中的细节讨论
    manacher(马拉车算法)
    博弈论(入门,持续更新)
    洛谷P1295 [TJOI2011]书架 线段树优化dp,单调栈
    洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
    洛谷 P1131 [ZJOI2007]时态同步
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/9307402.html
Copyright © 2020-2023  润新知