Django:模板系统_加载静态文件

加载静态文件

1、在一个网页中,不仅仅只有一个HTML骨架,还需要有CSS样式文件、JS执行文件以及一些图片等(这些就被称为静态文件)。因此在DTL中加载静态文件是一个必须要解决的问题

2、在DTL中,使用static标签来加载静态文件,要使用static标签的话,首先需要使用"{% load static %}"来标示加载静态文件

3、加载静态文件的步骤如下:
    ⑴首先确保'django.contrib.staticfiles'已经添加到了Settings.INSTALLER_APPS中:这个是创建工程时自动添加的
    ⑵确保在Settings.py中设置了STATIC_URL:创建工程时自动添加,默认值为'/static/'
    ⑶在已经安装、注册了的app下创建一个文件夹叫做static(名字必须为static,不然找不到),然后再在这个static文件夹下创建一个与当前app相同名字的文件夹,再把静态文件放到这个文件夹下。例如应用程序APP叫book,有一个静态文件叫做zh.jpg,那么路径为book/static/book/zh.jpg
    ⑷如果有一些静态文件不和任何APP挂钩,那么可以在settings.py中添加STATICFILES_DIRS的配置,以后DTL就会在这个列表中的路径下去查找静态文件
    ⑸在模板中使用load标签来加载static标签
    ⑹如果不想每次在模板中加载静态文件都使用load标签来加载static标签的话,那么可以在setting.py中的TEMPLATES/OPTIONS下添加'builtins':['django.templatetags.static'],这样以后在模版中就可以直接使用static标签,而不用手动的load了

4、Django静态文件的引用:
    ⑴在static标签中引用文件时有两个查找路径:1、app下的static。2、工程下的static(STATICFILES_DIRS),根目录下的static需要单独配置
    ⑵STATICFILES_DIRS告诉django,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的static文件夹里面找(注意,django查找静态文件是惰性查找,查找到第一个,就停止查找了)
    
注:为什么在应用程序APP下创建一个static文件夹后还需要在这个static文件夹下创建一个与app同名的文件夹呢?
1、因为,如果直接把静态文件放在static下(在模板加载静态文件的时候就是使用zh.jpg),那么如果多个app之间存在有同名的静态文件的话,这时候就会产生混淆。而在static文件夹下再增加一个与app同名的文件夹(当然这个文件夹的名字不一定必须与app名字一样),那么模板在加载的时候就是使用app/zh.jpg,这样就可以避免产生混淆(相当于加了一层查找条件)

2、这个跟前面介绍的模板查找路径类似,APP下的templates文件夹下我们也可以再创建一个文件夹(名字任意,比如book),这样在视图函数中就可以使用"render(request,book/xxx.html)"了,而不能直接"render(request,xxx.html)",因为默认情况下查找模板只会查找templates文件夹下的,因此在调用时必须把增加的那层路径加上

django.contrib.staticfiles

1、这个的具体作用目前还不知道是为什么,只是感觉是为了将静态文件与app等进行一种映射吧。这里在创建项目时会自动添加,只要我们不要没事找事把它删除或修改了就可以了

2、如果没有在settings.INSTALLED_APPS中添加django.contrib.staticfiles。那么就需要手动的将请求静态文件的url与静态文件的路径进行映射了(手动进行映射的话非常麻烦,所以只需要保证默认设置就可以了)

 

STATIC_URL

1、在创建项目后自动生成,默认值为'/static/':STATIC_URL = '/static/'。这个默认值最好不要修改

扫描二维码关注公众号,回复: 10292306 查看本文章

2、静态文件的默认开始查找路径,即会从项目根目录下的static文件夹或应用程序APP下的名为static的文件夹中开始查找

3、在浏览器中请求静态文件的url。例如:127.0.0.1/static/xxx.jpg

例1:使用绝对路径,应用程序下的静态文件(硬编码方式)
⑴编辑模板:视图函数没什么特别,就没截图

⑵访问

⑶直接通过浏览器访问静态文件

注:
1、上面例子中使用的是绝对路径来查找静态文件:
    ⑴因为在setting.py文件中STATIC_URL = '/static/',则表示在查找静态文件时会从项目根目录下的static或应用程序APP下的名为static的文件夹中开始查找(这个例子中是APP下的static文件夹)
    ⑵如果setting.py文件中STATIC_URL = '/abc/',那么在模板中调用静态文件时就应该是<img src="/abc/two.jpg">。不过最好不要修改默认设置。当然如果static文件夹下还有文件夹,那么在使用绝对路径时也需要对应变化(是从static文件夹开始查找的:static/book/two.jpg)

2、在浏览器中直接访问静态文件与访问一般的URL是不一样的:访问一般的URL访问的是模板,然后模板去找静态文件。而在这个例子中如果直接通过浏览器去访问静态文件,应该是http://127.0.0.1:8000/static/two.jpg

3、不过这种写法不建议:因为如果静态文件的默认查找路径修改了(STATIC_URL = '/static/'),那么就需要修改所有用到这个静态文件的模板中的路径了,这可能会使很大的一个工程。因此推荐使用static标签(跟URL跳转问题类似)

4、注意:如果static文件夹放在根目录下面,那么想要模板能正常找到对应的静态文件的话,就还需要单独设置下:在setting.py文件中增加静态文件的配置信息:根目录下的static文件夹一般存放的是项目公用的静态文件

STATICFILES_DIRS = [
    # static为项目路径下你存放静态文件的文件夹的实际路径
    os.path.join(BASE_DIR, 'static'),
]


    
 

例1_1:访问根目录下static下的静态文件
⑴编辑模板

⑵访问


1、模板调用根目录下static文件夹下的静态文件时,必须要先在setting.py中进行设置

2、因为配置的是os.path.join(BASE_DIR, 'static'),即表示只会寻找到static文件夹下的静态文件。比如static文件夹下还有个img的文件夹,那么在调用时就得是"/static/img/two.jpg"了。就跟前面介绍的模板(templates)查找路径一样

static标签

1、static标签是DTL模板语法中专门用来加载静态文件的

2、不过static标签不是Django内置的标签,因此在使用时必须先使用load标签来导入static标签

3、在模板中使用static标签来加载静态文件时,只需要传入静态文件的名字就可以了
    ⑴使用格式:{% static '静态文件名' %}。表示Django会在所有已经安装、注册了的APP下面或者根目录下面的static文件夹下查找对应名字的静态文件。(前提是只有一层static目录即static文件夹下直接就是静态文件了,中间没有其他目录)
    ⑵如果static文件夹下面还有文件夹,那么调用方式为{% static 'static下层文件夹名/静态文件名' %}:{% static 'book/two.jpg' %}

例2:使用static标签来加载静态文件
⑴编辑视图

⑵编辑模板

⑶访问

对静态文件夹分层

最前面说过,在实际生产中,静态文件的存放路径是:在APP或根目录下创建static文件夹后,再在其下创建一个与当前app相同名字(或其他名字)的文件夹,再把静态文件放到这个文件夹下。这样可以避免多个app之间存在有同名的静态文件时,会产生混淆

例3:未进行分层
⑴编辑模板:在app下和项目根目录下的static文件夹下都有一个同名的静态文件two.jpg

⑵访问

注:
1、一个大型项目中很有可能会出现这种情况:不同app下的static文件夹中或根目录下的static文件夹中存在相同名字的静态文件,如果不进行处理的话,就会出现访问出错的情况。如想要调用的是某个应用程序下的静态文件,结果实际调用的是根目录下的静态文件

2、为了解决这个问题,最简便的办法就是:在app下的static文件夹中或根目录下的static文件夹中继续创建文件夹来进行区分(app中的文件夹名字一般与app名字一样)

3、其实从这个例子中也可以看出,在查找静态文件时,如果配置的根目录的static文件夹的搜索路径的话,就先找根目录下的static文件夹,再找安装了的app下的static文件夹

例3_1:静态文件夹分层
⑴编辑模板

⑵访问

注:
1、应用程序下的static文件下夹继续根据应用程序名来新建文件夹:用来区别不用app间相同名字的静态文件

2、当然app名字文件夹下还可以继续细分静态文件:一般的话,就分为css、img、js分别来存放对应的静态文件

3、文件夹的建立有很多方式,主要还是在模板中的调用,反反正不管路径怎么变,模板中的调用路径一定要与实际一致:以static文件夹下的第一个文件夹开始写
    ⑴不管路径怎么变,在使用static标签加载静态文件时,都是从APP或根目录下的static文件夹下开始查找的(第一个路径参数前是没有斜杠的:{% static 'book/two.jpg' %})

将static标签变为内置标签

1、前面的例子中,我们在模板用使用static标签来加载静态文件时,都是先使用load标签来导入static标签:因为static标签不是Django的内置标签

2、如果不想每次在模板中加载静态文件都使用load标签来加载static标签的话,那么可以在setting.py中的TEMPLATES/OPTIONS下添加'builtins':['django.templatetags.static'],这样以后在模版中就可以直接使用static标签,而不用手动的load了

例4:

⑴设置配置

⑵编辑模板

⑶访问


 

备注

在DTL模板语法中,对于静态文件的查找路径、方法和模板HTML文件的查找路径、方法在很大程度上都是一样的。将设所有设置都是正确的

查找模板

1、根目录或应用程序APP下只有templates文件夹:那就可以直接使用模板名字,如render(request,'index.html')

 2、根目录或应用程序APP下的templates文件夹下还有文件夹:那在调用模板HTML文件时,必须从templates文件夹下的文件夹开始写,并加上中间的文件夹路径参数了render(request,'demo/index.html')

查找静态文件

1、使用绝对路径
        ⑴根目录或应用程序APP下只有static文件夹:那就可以直接使用static+静态文件名了,如"/static/two.jpg"。需要注意的是需要从static文件夹开始写且static文件夹前面有斜杠
        ⑵根目录或应用程序APP下的static文件夹下还有文件夹:那就需要加上中间的文件夹路径参数了,如"/static/img/two.jpg"

2、使用static标签
        ⑴根目录或应用程序APP下只有static文件夹:就可以直接使用静态文件名了,如"{% static 'two.jpg' %}"
        ⑵根目录或应用程序APP下的static文件夹下还有文件夹:那就需要加上中间的文件夹路径参数了,如"{% static 'polls/img/two.jpg' %}"

URL跳转

1、使用绝对路径:即使用完整的URL链接,如herf="http://127.0.0.1:8000/zh/school/"

2、使用相对路径:从根URLconf部分开始写且第一个ULR参数前需要有斜杠,如herf="/zh/school/"

3、使用URL标签:使用URL名字进行跳转,如herf="{% url 'polls:school' %}"


    

发布了9 篇原创文章 · 获赞 0 · 访问量 226

猜你喜欢

转载自blog.csdn.net/zh18380113164/article/details/105057583