1、URL的使用
1、urls.py
默认是在主目录中的,主路由配置文件,包含所有的地址映射
每一个请求到达之后,都会由urls.py中的urlpatterns列表中
的url()进行匹配。当url()匹配上之后,可能就会将请求转交
给其他的视图(Views)或其他的urls.py去处理
2、测试
1、在主目录中,创建 views.py
作用:包含所有定义好的视图(处理程序)
3、url函数详解
1、url函数的语法
url(regex,views,kwargs=None,name=None)
1、regex
正则表达式模式,匹配请求的url,字符串类型
2、views
当前url对应的处理的视图函数,此处写函数名即可
3、kwargs
字典,用来向views传参的,如果没有参数可以省略
4、name
字符串,给url()起别名,方便在模板中使用
2、通过 url 向 views 传参
1、使用正则表达式子组传参
使用子组传参 - (),一个子组是一个参数,如果想传递
多个参数的话,则使用多个子组,多个参数之间使用 /
分割
urlpatterns = [
# 访问路径是 run/ ,交给 run_views
url(r'^run/$',run_views),
# 访问路径是 run/两位数字,交给run_arg1_views
url(r'^run/(\d{2})/$',run_arg1_views),
# 访问路径是 run/两位数字/四位数字,交给run_arg2_views
url(r'^run/(\d{2})/(\d{4})',run_arg2_views),
]
注意:
1、在 url() 中,一个子组表示一个参数
2、在 views.py 中,对应的处理函数要根据url()中
子组的个数,相应的定义参数(形参)。定义的参数
要位于request之后
url(r'^run/(\d{2})/(\d{4})',run_arg2_views)
def run_arg2_views(request,num1,num2):
pass
2、使用url()第三个参数,字典传参
urlpatterns = [
url(
r'^show/$',
show_views,
{'name':'zsf','age':'25'}
)
]
def show_views(request,name,age):
pass
urls.py
from django.conf.urls import url
from django.contrib import admin
from .views import *
urlpatterns = [
url(r’^admin/’, admin.site.urls),
# 自定义url函数:定义一个访问路径,映射到对应的视图中
# 访问路径 http://localhost:8000/first/,
# 则由first_views视图处理
url(r'^first/$', first_views),
# 访问路径 http://localhost:8000/run/两位数字/
# 交给 run_arg1_views 处理
url(r'^run/(\d{2})/$', run_arg1_views),
# 访问路径 http://localhost:8000/run/四位数字/两位数字
# 交给 run_arg2_views 处理
url(r'^run/(\d{4})/(\d{2})/$', run_arg2_views),
# 访问路径 http://localhost:8000/show/
# 交给 show_views 处理
url(r'^show/$', show_views, {'name': 'zsf', 'age': '25'})
]
views.py
from django.http import HttpResponse
def first_views(request):
return HttpResponse(‘我的第一个django程序’)
def run_arg1_views(request, num1):
return HttpResponse(“参数为:” + num1)
num1 对应的是地址中的 四位数字
num2 对应的是地址中的 两位数字
def run_arg2_views(request, num1, num2):
return HttpResponse(“参数1:” + num1 + “,参数2:” + num2)
def show_views(request, name, age):
return HttpResponse(“姓名:
” + name + “
,年龄:” + age + “
”)2、Django中的应用
1、什么是应用
应用就是网站中的一块独立的程序
在Django中,主目录一般不处理用户的具体请求,主要做的是项目的
初始化以及请求的分发
2、创建应用
1、通过 指令 创建应用
./manage.py startapp 应用名称
ex:
./manage.py startapp news
tarena@tedu:~$ cd Django
tarena@tedu:~/Django$ django-admin startproject day02
tarena@tedu:~/Django$ cd day02
tarena@tedu:~/Django/day02$ ./manage.py startapp news
tarena@tedu:~/Django/day02$ ./manage.py startapp index
tarena@tedu:~/Django/day02$ ./manage.py startapp sport
tarena@tedu:~/Django/day02$ ./manage.py startapp music
tarena@tedu:~/Django/day02$ tree
.
├── day2
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
├── index
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
├── music
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── news
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
└── sport
├── admin.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
2、在 settings.py 中注册应用
在 INSTALLED_APPS 中追加应用名称
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'news',
'index',
'music',
'sport',
]
3、应用的结构组成
1、migrations 目录
存放数据库中间文件的目录(日志文件)
2、__init__.py
应用的初始化文件
3、admin.py
应用的后台管理配置文件
4、apps.py
应用的属性配置文件
5、models.py
模型配置文件
6、tests.py
测试模块
7、views.py
视图处理文件
练习:
1、创建 index 应用,并注册
2、创建 sport 应用,并注册
3、创建 music 应用,并注册
4、应用中的 urls
练习
1、访问 http://localhost:8000/news/index
交给news应用中的urls处理(找 index_views视图)
2、访问 http://localhost:8000/music/index
交给music应用中的urls处理(找index_views视图)
3、访问 http://localhost:8000/sport/index
交给sport应用中的urls处理(找index_views视图)
4、访问 http://localhost:8000
交给index应用中的urls处理(找index_views视图)
5、访问 http://localhost:8000/login
交给index应用中的urls处理(找login_views视图)
6、访问 http://localhost:8000/register
交给index应用中的urls处理(找regsiter_views视图)
7、访问 http://localhost:8000/news/
交给news应用中的urls处理(找 index_views视图)
8、访问 http://localhost:8000/music/
交给music应用中的urls处理(找 index_views视图)
9、访问 http://localhost:8000/sport/
交给sport应用中的urls处理(找 index_views视图)
3、Django中的模板(Tempates)
1、什么是模板
模板是要动态给用户呈现的网页
模板就是一个网页 - 前后端结合的网页
模板是通过视图(Views)呈现给用户的
2、模板的设置
在 settings.py 中 TEMPLATES 变量 进行模板的设置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
1、BACKEND:指定模板的搜索引擎,不用改动
2、DIRS:指定模板所存放的目录们
DIRS : ['index.temp','news.temp',...]
但是,如果DIRS中内容为空的话,那么Django会自动的到每个
应用下去搜索一个叫 templates 的目录作为模板的存放目录。
推荐:
1、DIRS内容为空
2、在每个应用中,创建一个 templates 目录
3、APP_DIRS
True:首先从DIRS中指定的目录中去查找模板,没找到的话再搜索templates目录
3、模板的加载方式
模板的加载需要在“视图”中完成
1、使用 loader 获取模板,通过 HttpResponse 进行响应
from django.template import loader
from django.http import HttpResponse
def index_views(request):
#1、通过 loader 加载模板(得到一个模板对象)
t = loader.get_template("模板名称")
#2、通过模板对象t,将模板渲染成字符串
html = t.render()
#3、通过 HttpResponse 将html响应给客户端
return HttpResponse(html)
2、使用 render 直接加载并返回模板
from django.shortcuts import render
def xxx_views(request):
return render(request,'模板名称')
4、模板的语法
1、变量
1、作用
允许将后端的数据传递给模板,在模板中,会根据变量的值进行显示
2、Django中允许传递给模板做变量的数据类型
数字,字符串,列表,元组,字典,函数,对象
3、变量的语法
通过一个字典,将要传递给模板的变量封装起来
dic = {
'变量1':'值1',
'变量2':'值2',
}
1、使用 loader
t = loader.get_template('模板名称')
html = t.render(dic)
return HttpResponse(html)
2、使用 render
return render(request,'模板名称',dic)
4、在模板中使用变量
使用 {{变量名}}
如果变量不存在或值为空的话,此位置不显示任何内容
练习:
在模板中显示以下内容:
书名:《水浒传》
作者:施耐庵
主题:105个男人和3个女人的故事
http://localhost:8000/run/15/
http://localhost:8000/run/ab/
http://localhost:8000/news/xxx/xxx : 交给news应用处理
http://localhost:8000/music/xxx : 交给music应用处理
http://localhost:8000/index/xxx : 交给index应用处理
… …
http://localhost:8000/news/index
交给news应用中的index_views视图处理
http://localhost:8000/news/xxx/xxx… 将请求转交给 news 应用中的 urls去处理
http://localhost:8000/news/show
将请求转交给 news 应用中的 urls 的 show 路径去处理
day2/day2/urls.py
from django.conf.urls import url, include
from django.contrib import admin
主路由配置文件
urlpatterns = [
# 请求路径 http://localhost:8000/…
# 一律都交给index应用中的urls模块去处理
url(r’^’, include(‘index.urls’)),
url(r’^admin/’, admin.site.urls),
# 请求路径 http://localhost:8000/news/…
# 一律都交给news应用中的urls模块去处理
url(r’^news/’, include(‘news.urls’)),
# 请求路径 http://localhost:8000/music/…
# 一律都交给music应用中的urls模块去处理
url(r’^music/’, include(‘music.urls’)),
# 请求路径 http://localhost:8000/sport/…
# 一律都交给sport应用中的urls模块去处理
url(r’^sport/’, include(‘sport.urls’)),
]
day2/index/templates/01_template.html
这是我的第一个模板
----------------------------------------------------- # day2/index/templates/02_var.html这是一个模板
标题为:{{title}}
---------------------------------------------------- # day2/index/templates/03_exer.html书名:<<{{title}}>>
作者:{{author}}
主题:{{topic}}
-------------------------------------------------- # day2/index/urls.py from django.conf.urls import url from .views import *当访问路径 http://localhost:8000/…
请求会转交到此处
urlpatterns = [
url(r’^
′
,
i
n
d
e
x
v
i
e
w
s
)
,
u
r
l
(
r
′
l
o
g
i
n
/
', index_views), url(r'^login/
′,indexviews),url(r′login/’, login_views),
]
urlpatterns += [
url(r’^01_getTemp/
′
,
g
e
t
T
e
m
p
v
i
e
w
s
)
,
u
r
l
(
r
′
0
2
g
e
t
T
e
m
p
/
', getTemp_views), url(r'^02_getTemp/
′,getTempviews),url(r′02getTemp/’, render_views),
url(r’^03_var/
′
,
v
a
r
v
i
e
w
s
)
,
u
r
l
(
r
′
0
4
v
a
r
E
x
e
r
/
', var_views), url(r'^04_varExer/
′,varviews),url(r′04varExer/’,varExer_views),
]
day2/index/views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
Create your views here.
def index_views(request):
return HttpResponse(‘index应用中的index视图’)
def login_views(requset):
return HttpResponse(‘index应用中的login视图’)
def getTemp_views(request):
# 1.通过 loader 加载模板
t = loader.get_template(‘01_template.html’)
# 2.将模板对象渲染成字符串
html = t.render()
# 3.将字符串响应给客户端
return HttpResponse(html)
def render_views(request):
return render(request, ‘01_template.html’)
def var_views(request):
dic = {
‘title’: ‘测试模板’,
‘content’: ‘模板的内容’,
}
return render(request, ‘02_var.html’, dic)
def varExer_views(request):
title = ‘水浒传’
author = ‘施耐庵’
topic = ‘105个男人和3个女人的故事’
# dic = {
# 'title':title,
# 'author':author,
# 'topic':topic,
# }
# locals() 将当前函数内的局部变量封装成一个字典,效果同上
return render(request, '03_exer.html', locals())
day2/music/urls.py
from django.conf.urls import url
from .views import *
请求路径是 http://localhost:8000/music/的时候
请求才会到此
urlpatterns = [
url(r’^index/$’, index_views),
]
day2/music/views.py
from django.shortcuts import render
from django.http import HttpResponse
Create your views here.
def index_views(request):
return HttpResponse(‘music应用中的index’)
day2/news/urls.py
from django.conf.urls import url
from .views import *
只有请求路径是 http://localhost:8000/news/…
才能进入到此路由配置
urlpatterns = [
# 请求路径是 show 的时候,则交给show_views去处理
url(r’^show/KaTeX parse error: Expected 'EOF', got '#' at position 21: …ow_views), #̲ 请求路径是 index 的时…’, index_views),
]
day2/news/views.py
from django.shortcuts import render
from django.http import HttpResponse
Create your views here.
def show_views(request):
return HttpResponse(‘这是news应用中的show_views视图’)
def index_views(request):
return HttpResponse(‘这是news应用中的index’)
day2/sport/urls.py
from django.conf.urls import url
from .views import *
请求地址 http://localhost:8000/sprot/…
请求会转发到此处
urlpatterns = [
url(r’^index/$’, index_views),
]
day2/sport/views.py
from django.shortcuts import render
from django.http import HttpResponse
Create your views here.
def index_views(request):
return HttpResponse(‘sport应用中的index’)
login.css
body,p,h1,h2,h3,h4,h5,h6,ul,ol{
margin:0;
}
#container{
width:990px;
margin:0 auto;
}
#container h2{
color:#999;
border-bottom:1px solid #ccc;
font-weight:400;
padding-bottom:15px;
margin-bottom:30px;
}
#login{
float:right;
margin-top:80px;
margin-right:50px;
}
#login .form-line{
overflow:hidden;
margin-bottom:20px;
}
#login .form-line>div{
float:right;
width:300px;
}
#login .form-line>p{
float:right;
margin-right:30px;
height:40px;
line-height:40px;
color:#999;
}
#login .form-control{
width:300px;
height:40px;
border:1px solid #ccc;
/*
300 298 2 0
元素width=内容宽度+左右border+左右padding
40 36 2 2
元素height=内容高度+上下border+上下padding
*/
box-sizing:border-box;
outline:none;
padding-left:15px;
}
#login p.anchor{
float:right;
}
#login p.saved{
float:left;
}
#login p.anchor a{
color:#999;
}
#login p.saved input{
width:16px;
height:16px;
/*
垂直对齐:控制当前元素两端文本相对于当前元素的垂直对齐方式
top:顶部对齐
middle:居中对齐
bottom:底部对齐
baseline:基线对齐
*/
vertical-align:middle;
}
#login div.form-line a.goReg{
float:right;
}
#login div.form-line a.goReg,#login div.form-line .btnLogin{
/宽度,高度,边框,边框倒角,文本水平居中对齐,行高,文字大小/
width:146px;
height:40px;
border:1px solid #7A8F66;
border-radius:5px;
text-align:center;
line-height:40px;
font-size:18px;
}
#img{
position:relative;
width:500px;
}
#img>a{
position:absolute;
/宽度,高度,边框,倒角,位置,文字:大小,颜色,居中,行高,取消下划线/
box-sizing:border-box;
width:156px;
height:50px;
border:1px solid #7A8B61;
border-radius:5px;
bottom:25px;
left:172px;
font-size:18px;
color:#7A8B61;
text-align:center;
line-height:50px;
text-decoration:none;
}
login.html
<!doctype html>