1、新建一个templates文件夹 --- 用来存放html
2、在站点中的settings的TEMPLATES中进行以下设置指定templates目录地址,
和工程目录同级
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 设置templates的路径
'DIRS': [os.path.join(BASE_DIR,'templates')],
'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',
],
},
},
]
3、在templates下创建html文件
4、使用:在应用的views中设置函数,将html文件渲染到页面,将想要显示的对象也引入
在views中方法返回/页面
data = {
'stus':stus
}
render(request,'压面',data)
def index(request):
if request.method == 'GET':
stus = Student.objects.all()
return render(request,'index.html',{'stus':stus})
5、在html中进行编辑
在html中使用for、if、while等需要注意格式问题,使用完函数需要加{% end函数名 %}
例子:
{% for stu in stus %}
ID:{{ stu.id }}
年龄:{{ stu.s_sge }}
{% endfor %}
{% if 表达式 %}
语句1
{% else %}
语句2
{% endif %}
例子
{% if stu.s_sex %}
性别:男
{% else %}
性别:女
{% endif %}
页面放在templates文件夹中,静态的文件(css、js等)放在static中
for循环,
if
ifequal --- 如果相等
forloop.counter --- 循环计数,从1开始依次加1
forloop.counter0 --- 循环计数,从0开始
forloop.revcounter0 --- 循环计数,倒序到0
forloop.frist --- 如果是第一个则是Ture
forloop.last --- 如果是最后一个则是Falase
{% for xx in xxx %}
{% endfor %}
{% if xxx==1 %}
{% endif %}
if的另一个写法
{% ifequal forloop.counter0 1 %}
年龄:{{stu.s_age }}
{% else %}
年龄:{{ stu.s_age }}
{% endifequal %}
编号
{{ forloop.counter }} ---循环一次值加一,默认是1,counter0为从0开始 revcounter -- 倒序
编号: {{ forloop.counter0 }}
{% if forloop.counter0 == 1 %}
学生:{{ stu.s_name}}
{% else %}
学生:{{ stu.s_name}}
{% endif %}
static文件夹(css、js、和images)
1、创建一个static文件夹,因为站点中的settings.py有:
STATIC_URL = '/static/'---如果文件名为其他名字,这里相应的进行修改就行了
在html文件中可以通过{% load static from staticfiles %}进行使用路径,例如:
--- 这里的static就是STATIC_URL的static,运用它可以方便路径发生改变时进行修改
2、设置static的路径
STATIC_URL = '/static/' --- 普通文件路径(例如图片),如果只是图片路径可以不写下面的代码
STATICFILES_DIRS = [ --- CSS和JS等需要使用此路径
os.path.join(BASE_DIR, 'static')
]
静态css、js、imgage样式的引入
在html中引入css、js、images
第一种:
第二种:
{% load static %}
最好使用第二种
js和imgage的引入也是一样
注释
---- 这个注释会在后台代码中显示
{# 注释 #} --- 不会再后台中显示
{% comment %}
{% endcomment%}
请求
request
http:get请求
request.GET.get()
http:post请求
request.POST.get()
判断请求:
request.method ==> GET,POST
render方法解释
此方法的作用---结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
解析
def index(request):
if request.method == 'GET':
stus = Student.objects.all()
# 其中{'stus':stus}的values的值是学生所有的对象,键就是在页面解析的参数的值
return render(request,'index.html',{'stus':stus})
在html页面通过{{ stus }} --- 将参数进行解析,获得Queryset对象
例子:
for循环用于解析数据,在页面中进行展示
{% for stu in stus %}
姓名:{{ stu.s_name }}
年龄:{{ stu.s_age }}
{% if stu.s_sex %}
性别:男
{% else %}
性别:女
{% endif %}
{% endfor %}
在页面显示学生对象的姓名和年龄
注意all()的使用
在html中获得Queryset不在是all(),而是all
{% for course in stu.course_set.all %}
课程:{{ course.c_name }}
{% endfor %}
过滤器
格式:{{ 对象.字段 | 过滤器:值 }}
add:数值
add:10 --- 加10 add:-10 --- 减10
语文成绩:{{stu.language_score | add:10 }}
date:'y-m-d h-m-s'--- 时间转换,如果时间是英文显示的,可以加过滤器date变为中文显示
创建时间:{{stu.create_time | date:'y-m-d h:m:s'}}
upper --- 大写 lower --- 小写
姓名:{{stu.s_name | upper | lower}} --- 多个过滤器可以一起写,采用最后一个过滤器
为了安全起见和防止页面是乱码,django提供了safe 过滤器,主要是一些特殊字符、空格、换行等
为了想要在页面显示正常,需要在数据后添加safe过滤器
{{ context | safe}}
显示关联表的信息
班级:{{stu.g.g_name}} --- g是在学生中关联的外键关系名
{% for course in stu.course_set.all %}
课程:{{ course.c_name }}
{% endfor %}
思路
1、先确定要完成的功能,在urls中定义路由
# 返回页面,学生信息
url(r'selStuen',views.selStuen,name='sel_stu'),
2、在views中建立方法
def selStuen(request):
if request.method == 'GET':
return render(request, 'students.html')
返回student.html页面
3、将要渲染的的对象,包装进入student.html页面
def selStuen(request):
if request.method == 'GET':
stus = Student.objects.all()
return render(request, 'students.html',
{'stus': stus})
4、在html中写循环(可以使用表格进行布局)
ID
姓名
年龄
班级
操作
{% for stu in stus %}
{{stu.id}}
{{stu.s_name}}
{{stu.s_age}}
{{stu.g.g_name}}
删除
编辑
{% endfor %}
5、实现删除功能
定义路由
# 删除
url(r'deleteStu',views.deleteStu),
建立方法
def deleteStu(request):
if request.method == 'GET':
stu_id = request.GET.get('stu_id')
stu = Student.objects.get(id=int(stu_id))
stu.delete()
# return HttpResponse('删除成功')
# return HttpResponseRedirect('/app/selStuen')
# 最好用下面的代码,不要使用路径
return HttpResponseRedirect(reverse('myapp:sel_stu'))
思考:当点击删除时,我们应该获得想要删除的数据的id值
1、在?后传的值传进deleteStu中 --- 删除
{{ i }} --- 另一种写法的传参
?后面的长度:协议并没有限制长度,但是不同的浏览器对齐有不同的限制
后端将接受deleteStu方法
2、添加课程 ---
设置路由: url(r'addStuCourse/(\d+)', views.addStuCourse) --- (\d+)接收动态的id
3、在方法中添加参数,接收获取的动态id
def addStuCourse(request, id):
if request.method == 'GET':
# stu = Student.objects.get(id=id)
courses = Course.objects.all()
return render(request, 'courses.html',
{'courses': courses})
if request.method == 'POST':
stu = Student.objects.get(id=id)
c_id = request.POST.get('c_id')
c = Course.objects.get(id=c_id)
stu.course_set.add(c)
return HttpResponseRedirect('/app/selStuen/')
注意a标签的href问题
退出登陆 --- 跳转到相应的页面
退出登陆 --- 在当前的页面后添加href路径
也可以向下面一样写:和第一个类似
文章列表
模板继承
挖坑、填坑
一般是创建一个base.html页面,用来挖坑,创建一个base_main.html用来填页面共同拥有的坑,在页面中继承base_main.html
1、在基础模板中挖坑(base.html)
{# 挖坑 #}
{% block title %}
{% endblock %}
{# 挖坑 #}
{% block extCss %} --- 同样可以给js挖坑
{% endblock %}
{# 挖坑 #}
{% block content %}
{% endblock %}
2、填坑 --- 在页面中继承继承模板
{% extends 'base.html' %}
{% block titel %}
我是首页
{% endblock %}
{% block extCss %}
{{ block.super }} --- 继承基础模板坑中的内容,如果不写继承就会清空基础模板的内容
{% endblock %}
{% extends 'base.html' %}可以看做整个base.html页面,在base.html中挖的坑可以看做是类(base.html)
中的方法,其他页面通过{% extends 'base.html' %}继承了base.html的整个页面
{% 在某个标签中挖的坑,就可以看做这个标签中的父坑 %},其他页面可以通过{{block.super}}继承这个父坑的
内容,并在其后添加内容(类似于类的继承)
注意:如果没有使用{{ blcok.super }}继承,则父坑的内容将不会继承
如果不写坑名则自动继承主坑的内容
如果写了坑名,不写block.super就会清空主坑的内容。
写了坑名并且使用了block.super就会继承主坑的内容