python学习 --Django学习5、数据库查询、页面重定向

创建老师表

use vote;

create table `tb_teacher` (
`no` integer not null auto_increment comment '编号',
`name` varchar(20) not null comment '姓名',
`sex` boolean not null default 1 comment '性别',
`birth` date not null comment '出生日期',
`intro` varchar(1000) not null default '' comment '介绍',
`photo` varchar(255) not null default 'default.png' comment '照片',
`gcount` integer not null default 0 comment '好评数',
`bcount` integer not null default 0 comment '差评数',
`sno` integer not null comment '所属学科',
primary key (`no`),
foreign key (`sno`) references `tb_subject` (`no`)
);

把表映射到models.py中

	django虚拟环境终端中
	
	python manage.py inspectdb tb_subject tb_teachers > polls/models.py 
	#映射指定的表到models.py中,避免吧django中的表映射过去

自定义映射表的类

from django.db import models


class Subject(models.Model):
    no = models.AutoField(primary_key=True,verbose_name='编号')      #django后台起中文名verbose_name参数
    name = models.CharField(max_length=20,verbose_name='名称')
    intro = models.CharField(max_length=1000, blank=True, null=True,verbose_name='介绍')
    is_hot = models.BooleanField(default=False, null=True,verbose_name='是否热门')

    class Meta:
        managed = False
        db_table = 'tb_subject'
        verbose_name = '学科' 
        verbose_name_plural = '学科'
    
SEX_OPTIONS = (
    (True,'男'),
    (False,'女')
)

class Teachers(models.Model):
    no = models.AutoField(primary_key=True,verbose_name='编号')
    name = models.CharField(max_length=10,verbose_name='姓名')
    sex = models.BooleanField(default=True,choices=SEX_OPTIONS,verbose_name='性别')
    #为了比较直观,为True时显示男,为False时显示女
    
    birth = models.DateField(verbose_name='出生日期')
    intro = models.CharField(max_length=1000, blank=True, null=True,verbose_name='介绍')
    good_count = models.IntegerField(blank=True, null=True,verbose_name='好评')
    bad_count = models.IntegerField(blank=True, null=True,verbose_name='差评')
    photo = models.ImageField(max_length=100,verbose_name='照片') #改为imageField可以处理图像,
    #改为ImageField必须下载依赖库,  pip install Pillow
    
    subject = models.ForeignKey(to=Subject, on_delete=models.DO_NOTHING, db_column='subject_no')
    # DO_NOTHING这个参数意思是删除学科根据数据库设定是否删除老师
    #db_column='subject_no'  这个是指定对应数据库那个字段

    class Meta:
        managed = False
        db_table = 'tb_teachers'
        verbose_name = '老师'
        verbose_name_plural = '老师'

自定义模型显示方式
在admin.py中
#在之前修改上新加了老师类

from django.contrib import admin
from polls.models import Subject,Teachers

class SubjectModelAdmin(admin.ModelAdmin):
    list_display = ('no','name','intro','is_hot')
    search_fields = ('name',)
    ordering = ('no',)    #subject学科的显示方式,上文中有详解
    
class TeachersModelAdmin(admin.ModelAdmin):                                        #添加这个
    list_display = ('no','name','sex','birth','good_count','bad_count','subject')  
    search_fields = ('name',)                                                                           
    ordering = ('no',)  #teachaers老师的显示方式                                          

admin.site.register(Subject,SubjectModelAdmin)
admin.site.register(Teachers,TeachersModelAdmin)       #映射到后台

在后台手动添加外键项时不方便

	在models.py中Subject类添加__str__方法,后台要调用这个类就会返回这个类的名称属性
	
	    def __str__(self):
    		return self.name
	-- 再次刷新后台添加外键数据的时候就显示中文

在views.py中修改teachers函数

def show_teacher(request: HttpResponse)        ->HttpResponse:
    try:
        no = int(request.GET.get('sno',1))
        #print(no)
        subject = Subject.objects.only('name').get(no=no) #根据传入的sno值查找学科名称,不加only也可以
        teachers = Teacher.objects.filter(sno=no).order_by('no')   #根据传入的no值,然后根据外键查询老师
        return render(request,'teachers.html',{'teachers': teachers,'subjects':subject})

    except (ValueError,Subject.DoesNotExist):
        return redirect('/')   #页面重定向

修改teachers.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>老师信息</title>
    <style>
        #container {
            width: 80%;
            margin: 10px auto;
        }
        .teacher {
            width: 100%;
            margin: 0 auto;
            padding: 10px 0;
            border-bottom: 1px dashed gray;
            overflow: auto;
        }
        .teacher div {
            float: left;
        }
        .photo {
            height: 140px;
            border-radius: 75px;
            overflow: hidden;
            margin-left: 20px;
        }
        .info {
            width: 75%;
            margin-left: 30px;
        }
        .info div {
            clear: both;
            margin: 5px 10px;
        }
        .info span {
            margin-right: 25px;
        }
        .info a {
            text-decoration: none;
            color: darkcyan;
        }
        .user {
            float: right;
            margin: 10px 10px;
        }
        .user+h1 {
            clear: both;
        }
        #photo {
            border-radius: 32px 32px 32px 32px;
        }
    </style>
</head>
<body>
    <div id="container">
    <hr>
    {% if not teachers %}
        <h2>暂无该老师的信息</h2>
    {% endif %}
        <h1>{{ subjects.name }}学科的老师</h1>
        <hr>
        {% for teacher in teachers %}
        <div class="teacher">
            <div class="photo">
                <img src="static/images/{{ teacher.photo }}" height="140" alt="">
            </div>
            <div class="info">
                <div>
                    <span><strong>姓名:{{ teacher.name }}</strong></span>
                    <span>性别:{{ teacher.sex | yesno:'男,女' }}</span>
                    <span>出生日期:{{ teacher.birth }}</span>
                </div>
                <div class="intro">{{ teacher.intro }}</div>
                <div class="comment">
                    <a href="">好评</a>&nbsp;&nbsp;(<strong>{{ teacher.gcount }}</strong>)&nbsp;&nbsp;&nbsp;&nbsp;
                    <a href="">差评</a>&nbsp;&nbsp;(<strong>{{ teacher.bcount }}</strong>)
                </div>
            </div>
        </div>
        {% endfor %}
        <a href="/">返回首页</a>    #返回'/'url
    </div>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值