模板的继承
子类可以继承父类模板,并将其进行重写
不重写就按照父类模板中的内容进行输出
重写就按照重写内容中的标签输出
注:动态传入父类中的数据,子类是无法访问的,也加载不到对应的数据到页面中,即使继承了父类的内容
语法,在父类中
1.可能被子类继承的标签放在block中
即
{% block block_name %}
…
{% endblock %}
2.继承后不允许修改的标签不要使用block进行包括
语法,在子类中
1.第一行就要确认继承的父类的html
{% extends ‘father.html’ %}
2.重用父类中的标签要使用{% blockblock_name %}来定位到指定的标签
即
{% block block_name %}
修改父类中的标签的内容
{%endblock %}
这是父类的html文件,名称为home_view.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% block mytitle %}
<title>首页</title>
{% endblock %}
</head>
<body>
<a href="/home_index">首页</a>
{% block url %}
<a href="/music_index">音乐频道</a>
<a href="/sport_index">体育频道</a>
{% endblock %}
<br>
{% block text %}
<p>这是首页</p>
{% endblock %}
<br>
<br>
<br>
<br>
<br>
<p>有事请联系xxxx</p>
</body>
</html>
这是两个子类的html,名称为music.htm和sport.html
{% extends 'home_view.html' %}
{% block mytitle%}
<title>体育频道</title>
{% endblock %}
{% block url %}
<br>
{% endblock %}
{% block text %}
<p>欢迎来到音乐频道</p>
{% endblock %}
{% extends 'home_view.html' %}
{% block mytitle%}
<title>体育频道</title>
{% endblock %}
{% block url %}
<br>
{% endblock %}
{% block text %}
<p>欢迎来到体育频道</p>
{% endblock %}
在将其对应的函数和访问路由加入到urls.py中
URL反向解析
绝对地址,和相对地址
当a标签中传入href=以’/‘开头,说明是相对地址,指在主路由后面进行拼接
当不传入’/‘时,会在当前url中向前寻找一个’/‘然后将其进行拼接原来的’/'后面的参数就不会留下
也可以在html文件中传入 {% url ‘别名’ ‘参数’ %}
在url.py中设置path
path(‘url’,views.func,name=‘别名’)进行url的反向解析
例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试url</title>
</head>
<body>
<a href="http://127.0.0.1:8000/First_text_url">绝对地址</a>
<a href="/text">带有'/'的url</a>
<a href="text">不带'/‘的url</a>
<br>
<a href="{% url 'br' %}">url的反向解析</a>
</body>
</html>
path('First_text_url',views.First_text_url,name='br'),// 显示这里是绝对地址
path('text_url/url',views.text_url)显示有4个链接的页面
这个是绝对地址的url
这个是4个链接的url
这个是加上'/'的url,返回主路由地址加上text的拼接地址
这个是不加'/'的url,针对于127.0.0.1:8000/text/url这个地址向前面寻找第一个'/'将text拼接在后面
这个是反向解析的url,因为传递了参数,相当于起了别名,将br传入html文件中的url过滤器中,就可以将对应的路由地址进行拼接
也可以进行参数的传递
<a href="{% url 'tr' '100' %}">传参的url反向解析</a>
def text_url(requests,age):
return render(requests,'text_url.html')
path('text_url/url/<int:age>',views.text_url,name='tr')
也可以在视图函数中调用django中的reverse方法来实现url反向解析
def First_text_url(requests):
# html = '这里是绝对地址的网页'
# return HttpResponse(html)
from django.urls import reverse
url = reverse('home_index')
return HttpResponseRedirect(url)
向http://127.0.0.1:8000/First_text_url这个网页发送请求会报302跳转到http://127.0.0.1:8000/home_index这个网页,原因是在reverse中传入了一个别名
path('home_index',views.home_index,name='home_index'),
这个别名就是home_index对应的path下的别名
静态文件的处理
首先要在settings中配置静态文件的访问路径[该配置默认存在]
STATIC_URL = ‘/static/’
当django得到一个url中含有/static/的请求,则会到默认访问路径中去加载对应的静态文件
例如:127.0.0.1:200/static/xxx(xxx为静态文件的访问位置)
配置路径的方法在settings文件中创建一个叫STATICFILE_DIRS的元组
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)
然后再当前项目下创建一个名叫static的文件夹
可以在static文件夹下面创建子目录
下面利用模板写一个加载静态问文件的路由
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Image的显示</title>
</head>
<body>
<img src='http://127.0.0.1:200//static/images/1.jpg' height="200px" width="200px">
<img src="/static/images/1.jpg" height="200px" width="200px">
</body>
</html>
这里是相对地址,访问绝对路由下的/static/说明,框架要加载static目录下的images/1.jpg文件
文件加载成功
也可以使用django内置的{% static ‘path’ %}来加载图片
在使用之前要加载一下
即
{% load static %}
{% load static %}
<img src='http://127.0.0.1:200//static/images/1.jpg' height="200px" width="200px">
<img src="/static/images/1.jpg" height="200px" width="200px">
<img src="{% static 'images/1.jpg' %}" height="200px" width="200px">
这是网页的源代码
第三中使用django内置的方式是动态的方法,其相对于网页的加载更加温和
即如果想改变获取静态文件的方式将/static/该为/abc/前两这就会拿不到数据,而最后以个可以动态的获取数据,但要在settings文件中更改一下STATIC_URL的值,其默认为/static/
STATIC_URL = '/abc/'
则网页源代码中前两者还是原来的地址,而最后一个是改变后的地址,但是文件夹中不含有abc的文件,这样就显示了动态性质
django的分布式路由
一个网站可能含有多个模块,所有的视图函数都在views里面的话,后期的修改和管理会很麻烦,所以django提供了一个应用的模块
什么是应用
应用是在django项目中的独立的业务模块,可以包含自己的路由,视图和模板,模型
应用的创建
启动命令: python manage.py startapp [应用名]
自己创建的一个应用需要在settings中的INSTALLED_APPS 添加
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'music'# 自己创建的应用要加入到INSTALLED_APPS中
]
应用的目录
创建的app目录下有如下的文件
migrations:是模型层,用于和数据库连接的操作
admin:是用户,管理后台相关
apps:应用下的相关配置
models:模型层的代码实现在这个文件中
textes:专门用来测试的入口
views:视图函数的实现入口
django中,主路由配置可以不处理具体的路由,他可以做请求的分发,具体的请求可以由各自的应用进行处理
假如URL为/news/的请求一律交给news的应用来处理
url为/music/的请求交给music的应用来处理
配置分布式路由
在主路由中调用include函数
语法include(‘app_name.url模块的名字’)
例如
path('music/',include('music.urls')# 在使用include时要导入include模块,其在django.urls这个包当中
# 格式一定不能出错,前面的一定是应用名加/不能再两边都加上/也不能只在左边加上/
当url中出现/musci是会将请求发送给music的应用
要在music中创建一个urls.py的模块,内容要和主路由的初始状态一致
即要导入 dajango.urls中的path模块
和当前文件夹下的视图views模块
from django.urls import path
from . improt views
urlpatterns = [
path('text_01/', views.text_01),
]
要在视图函数中实现text_01的函数
实例:
创建两个应用: sport和learn
将两个应用加到主路由当中去
在两个应用中创建urls.py文件,并将urlpatterns写入文件中
from django.urls import path
from . import views
urlpatterns = [
path('text_01',views.text_01)
]
在views文件中实现函数的操作
写一个主页的函数,然后将html文件render一下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<a href="/music/text_01">音乐主页</a>
<a href="/sport/text_01">体育主页</a>
<a href="/learn/text_01">学习主页</a>
</body>
</html>
操作完成