1-model的继承
什么时候使用:当model出现很多相同的字段时,可以选择使用,举例:定义Teacher和Stu两个类,都有相同的属性:姓名,年龄,性别。为方便操作,这时就可以来额外定义一个human类,来定义这三个属性,话不多说,贴代码如下:
class Human(models.Model):
name=models.CharField(
verbose_name="姓名",
max_length=20
)
age=models.IntegerField(
verbose_name="年龄"
)
sex=models.CharField(
verbose_name="性别",
max_length=10
)
#当model出现很多重复的字段时,可以写一个合理的抽象类
class Meta:
abstract=True
class Stu(Human):
score=models.IntegerField(
verbose_name="成绩"
)
class Teacher(Human):
salary=models.IntegerField(
verbose_name="薪水"
)
这样,在执行完数据迁移后,我们就可以在相应的数据库中看到两个名为项目名_teacher和项目名_stu的两个数据表,划重点:
class Meta:
abstract=True
一定要写在需要继承的那个(Human)里面。
2-模板的处理过程
模板的处理过程分为加载和渲染,在这里先介绍原生写法(views.py):
def get_teacher(req):
res = Teacher.objects.all()
return render(req,
'templates/teach04/teachers.html',
context={'teachers':res})
def get_teachers_v1(req):
#加载模板
template=loader.get_template('templates/teach04/teachers.html')
print(template)
print(dir(template))
#拿数据
res=Teacher.objects.all()
template_str=template.render({{'teacher':res}})
#将渲染得到的HTML返回到请求
return HttpResponse(template_str+" 已经完成")
1-点语法:通过变量访问属性或方法。
<h1>教师工资如下(访问某个变量的值):</h1>
<ul>
{% for i in teachers %}
{% if i.id == 2 %}
<li style="color: #00A000">{{i.name}}的工资是{{ i.salary }}</li>
{% else %}
<li style="color: #0000aa"></li>
<p>{{ i.get_base_msg }}</p>
{% endif %}
{% endfor %}
</ul>
2-通过下标访问数组内的元素:
<h1>这里是第几个的获取(下标访问数组内的元素)</h1>
<p>{{teachers.0.get_base_msg}}</p>
<hr>
<ul>
{% for i in teachers %}
<li>第{{ forloop.counter }}条数据:{{ i.get_base_msg }}</li>
{# {% if forloop.counter == 1%}#}
{% if forloop.first %}
<li style="color: #00A000">第{{ forloop.counter }}数据</li>
{% else %}
<li style="color: #cc0000">第{{ forloop.counter }}数据</li>
{% endif %}
{% endfor %}
</ul>
<hr>
3-if 条件判断
格式:
{% if 表达式 %}
语句
{% endif %}
{% if 表达式 %}
语句
{% else %}
语句
{% endif %}
{% if 表达式 %}
语句
{% elif 表达式 %}
语句
{% endif %}
举例参考上一条,已经有用到。
4-乘除
格式:{%withratio 数 分母 分子 %}
5-整除
格式:{%if 你的数字 | divisibleby:要整除几%}
6-转日期
格式:{{ dateVal | date:'y-m-d' }}
<ul>
{% for i in teachers %}
{# 乘除withratio#}
{% widthratio i.age 1 3 %}
{# 整除 有毒#}
{% if 16|divisibleby:2 %}
<li style="color:red">老师是{{ i.name }}</li>
{% endif %}
{# 判断是否相等#}
{# 字母大小写/join#}
{{ i.name |upper }}
{{ i.name|join:3}}
{# 转日期#}
<br>
{% endfor %}
<hr>
因为自己的数据表中未涉及到时间日期的相关数据,所以咸鱼婷也做不了详细举例啦,想要了解到同志们可以直接去访问官方文档。
7-注释
单行不可见使用: {#你想注释的内容#}
多行不可见使用:
{%comment%}
你
的
注
释
{%endcomment%}
8-获取循环次数:
{{ forloop.counter }} 表示当前是第几次循环,从1数数
{{ forloop.counter0}}表示当前是第几次循环,从0数数
{{ forloop.revcounter}}表示当前是第几次循环,倒着数数,到1停
{{ forloop.revcounter0}}表示当前第几次循环,倒着数,到0停
{{ forloop.first }} 是否是第一个 布尔值
{{ forloop.last }} 是否是最后一个 布尔值
9-判断是否等于
格式:{%ifequal teachers.1.id 2%}
等于
{%else%}
不等于
{%endifequal%}
10-部分操作
add:{{变量 |add:5}}
lower:{{变量 | lower}} upper:大写,一样的用法
11-反向解析(利用相应的命名空间和URL名字来找到对应的逻辑处理)
做法:1-在工程的urls.py中,加入namespace
url(r'^teach04/', include('teach04.urls',namespace='teach04')),
-
2-在项目的urls.py中,加入name参数:
url(r"^stu$", get_stu,name="stu"),
3-前端
{%url‘teach04:stu'%}
4-后端
def index(req):
return HttpResponseRedirect(reverse('python1803:czn'))
解释:HttpResponseRedirect 是重定向
reverse('
teach04:stu'
)