###如何建立展示页面

1.使用url传递参数:匹配url,捕获用户选择的no,但在Django1中使用正则表达式,命名捕获组在python中必须要加一个P
path(‘subjects/int:no/‘, views.show_teachers)
拿到的方法是:<a href=”/good/“
如何拿到?后面的数据?
2.ORM(对象关系映射)框架
3.模型的创建
4.属性访问器
5.加载静态资源

####展示student和teacher页面

#####首先建立模型:models.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Subject(models.Model):
no = models.AutoField(primary_key=True, db_column='sno', verbose_name='编号')
name = models.CharField(max_length=50, db_column='sname', verbose_name='名称')
intro = models.CharField(max_length=511, db_column='sintro', verbose_name='介绍')

def __str__(self):
return self.name

class Meta(object):
db_table = 'tb_subject'
ordering = ('no', )
verbose_name_plural = '学科'
verbose_name = '学科'


# Django 框架中包含了一个ORM(对象关系映射)框架
# ORM 可以帮助我们完成对象模型到关系模型的双向转换
class Teacher(models.Model):

# 自增长的字段, 对应的列是tno
no = models.AutoField(primary_key=True, db_column='tno', verbose_name='编号')
# 字符串, 数据库里面的名字(加前缀表示)
name = models.CharField(max_length=20, db_column='tname', verbose_name='姓名')
manager = models.BooleanField(default=False, db_column='tmanager', verbose_name='是否是主管')
# job = models.CharField(max_length=10, db_column='tjob', verbose_name='职位')
intro = models.CharField(max_length=1023, db_column='tintro', verbose_name='介绍')
motto = models.CharField(max_length=255, db_column='tmotto', verbose_name='理念')
photo = models.CharField(max_length=511, db_column='tphoto', null=True, blank=True)
# 多的这边通过外键列建立关系, 外键列参照了Subject, 外键类on_delete=PROTECT不运行删除,级联就是一起删除,有老师的学科不让删除
subject = models.ForeignKey(Subject, db_column='sno', on_delete=PROTECT, related_name='+', verbose_name='所属学科')
good_count = models.IntegerField(default=0, db_column='tgcount', verbose_name='好评')
bad_count = models.IntegerField(default=0, db_column='tbcount', verbose_name='差评')

# 属性的访问器,getter方法,将方法包装成属性,可以直接使用
@property
def gcount(self):
return f'{self.good_count}' \
if self.good_count <= 999 else '999+'

@property
def bcount(self):
return f'{self.bad_count}'\
if self.bad_count <= 999 else '999+'

# 内部类,给表改名字,Meta代表这个表的原数据
class Meta(object):
db_table = 'tb_teacher'
verbose_name = '讲师'
verbose_name_plural = '讲师'

views.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
'''
两个非常重要的对象:
HttpRequest
HttpResponse
'''


def show_subjects(request):
# no = randint(1, 6)
# 通过指定的主键取到某一个老师
# ctx = {'teacher': Teacher.objects.get(pk=no)}

ctx = {'subjects_list': Subject.objects.all()}

# teacher = {
# 'name': 'yt',
# 'intro': 'python',
# 'motto': 'happy',
# }
# ctx = {'teacher': teacher}
# teacher = {'name': '王',
# 'intro': 'python',
# 'motto': 'protact makes profect'}

return render(request, 'subject.html', ctx)


def show_teachers(request, no):
# 通过学科的编号查老师,1,查老师表,筛选学科;2,通过学科反查老师
# 拿到指定学科的一个模型实体,使用自带的teacher_set属性反查老师
# teachers = Subject.objects.get(pk=no).teacher_set.all()
# subject对象里的no属性等于我们传进来的no
teachers = Teacher.objects.filter(subject__no=no)
ctx = {'teachers_list': teachers}
return render(request, 'teacher.html', ctx)

####urls

1
2
3
4
urlpatterns = [
path('admin/', admin.site.urls),
# 匹配url,捕获用户选择的no,但在Django1中使用正则表达式,命名捕获组在python中必须要加一个P
path('subjects/<int:no>/', views.show_teachers),

subjects.html文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学科信息</title>
</head>
<body>
<h1>学科信息</h1>
<hr>
<ul>
{% for subject in subjects_list %}
<li>
<a href="/subjects/{{ subject.no }}">{{ subject.name }}</a>
</li>
{% endfor %}
</ul>
</body>
</html>

teacher.html文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<!DOCTYPE html>
{% load staticfiles %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title-information</title>
</head>

<body>
<style>
.basic{
width: 60%;
margin-right: 20px;
float:left;
}
#img{
width: 40%;

}
hr{
clear: both;
}
.button{
display:inline-block;
width: 80px;
height: 30px;
background-color: red;
color: white;
font: 16px/30px Arial;
text-decoration: none;
text-align: center;
}
</style>
{% for teacher in teachers_list %}
<div>
<div class="basic">
<h1>{{ teacher.name }}老师</h1>
<hr>
简介
<p>{{ teacher.intro }}</p>
理念
<p>{{ teacher.motto }}</p>
{#执行js功能链接#}
<a id="{{ teacher.no }}" href="javascript:void(0);" class="good button">like({{ teacher.good_count }})</a>
<a mydata="{{ teacher.no }}" href="javascript:void(0);" class="bad button">dislike({{ teacher.bad_count }})</a>
</div>
{# 加载静态资源#}
<div id="img" >
<p><img src="{% static teacher.photo %}" alt=""></p>
</div>
</div>
{% endfor %}

<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

<script>
$(function(){
$('.good').on('click', function(evt){
{#拿到事件源 a标签#}
var a = $(evt.target);
$.getJSON('/good/' + a.attr('id'), function(json){
if (json.code == 200){
a.text('like(' + json.good + ')');
}
})
});
$('.bad').on('click', function(evt) {
var a = $(evt.target);
$.getJSON('/bad/' + a.attr('mydata'), function(json){
if (json.code == 200){
a.text('dislike(' + json.bad + ')')
}
})
})
});

</script>
</body>
</html>