Django应用开发实践——01初级实践

本博客为本人学习张老师Django实践中的个人学习笔记。

细节问题参考张老师博客:https://blog.csdn.net/m0_38139250/category_12208290.html
注:本博客Django版本采用4.1.7

文章目录

01入门

conda切换环境(看需要)

conda env list 			#查看conda环境
conda activate ipy9		#激活环境

新建虚拟环境

基于venv

#创建虚拟环境
python -m venv vip3-django
#激活虚拟环境
vip3-django\Scripts\activate
#安装依赖
python -m pip install django
#关闭虚拟环境
deactivate

django项目构建

Django项目安装
python -m pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple
创建项目
django-admin startproject 你的项目名字
django-admin startproject djangoproject
启动项目
python djangoproject\manage.py runserver
127.0.0.1:8000		#浏览器输入
创建应用
cd djangoproject     #切换到项目目录下
django-admin startapp 你的app名字		
django-admin startapp app1			#创建应用

在settings.py中修改设置

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1.apps.App1Config', #新建的应用
]

'DIRS': [os.path.join(BASE_DIR,'templates')],# 指定templates的路径

#在settings.py中修改时区语言
#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
#TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

#在settings.py中修改静态路径
STATIC_URL = 'static/'
# 指定静态文件的存放路径,新增部分
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR),
]

在templates路径下创建index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>hello world</p>
</body>
</html>

在app1的views.py中创建后台逻辑

def index(request):
    return render(request,'index.html')

在urls.py中添加路由信息

from app1 import views # 新增

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index',views.index) # 新增 对于index的访问,转发到views.index函数,进行处理
]

再次运行,就可以查看到相关页面了

python djangoproject/manage.py runserver
http://127.0.0.1:8000/index

总结

创建工程
创建app1
配置setting.py :配置app,templates路径 ,时区 ,语言, static路径
在templates创建html页面
在app1下的views.py创建函数,函数返回指定页面
在urls.py中配置路由,前端访问与views中函数的对应
传参:
后端通过{key:value}
前端接受: {{ key }}

02创建应用

创建app

cd djangoproject
django-admin startapp first

修改视图views.py

from django.http import HttpResponse
from random import sample
def show_index(request):
    fruits = [
        'Apple', 'Orange', 'Pitaya', 'Durian', 'Waxberry', 'Blueberry',
        'Grape', 'Peach', 'Pear', 'Banana', 'Watermelon', 'Mango'
    ]
    selected_fruits = sample(fruits, 3)
    content = '<h3>今天推荐的水果是:</h3>'
    content += '<hr>'
    content += '<ul>'
    for fruit in selected_fruits:
        content += f'<li>{fruit}</li>'
    content += '</ul>'
    return HttpResponse(content)
    # return HttpResponse('<h1>Hello, Django!</h1>')

修改Django项目目录下的urls.py文件

from django.contrib import admin
from django.urls import path, include
from ..first import views as first_views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('first/', first_views.show_index),
]

重新运行项目

python manage.py runserver
http://127.0.0.1:8000/first/

基于模板完成页面开发

通过拼接HTML代码的方式为浏览器生成动态内容的做法在实际开发中是无能接受的。这时可以基于一个模板页(MTV中的T),所谓模板页就是一个带占位符和模板指令的HTML页面。

Django框架中有一个名为render的便捷函数可以来完成渲染模板的操作。所谓的渲染就是用数据替换掉模板页中的模板指令和占位符,当然这里的渲染称为后端渲染,即在服务器端完成页面的渲染再输出到浏览器中。

在项目目录下创建名为templates文件夹
添加模板页index.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
        <style>
            #fruits {
                font-size: 1.25em;
            }
        </style>
    </head>
    <body>
        <h1>今天推荐的水果是:</h1>
        <hr>
        <ul id="fruits">
            {% for fruit in fruits %}
            <li>{{ fruit }}</li>
            {% endfor %}
        </ul>
    </body>
</html>
修改views.py文件,调用render函数渲染模板页
from random import sample

from django.shortcuts import render


def show_index(request):
    fruits = [
        'Apple', 'Orange', 'Pitaya', 'Durian', 'Waxberry', 'Blueberry',
        'Grape', 'Peach', 'Pear', 'Banana', 'Watermelon', 'Mango'
    ]
    selected_fruits = sample(fruits, 3)
    return render(request, 'index.html', {'fruits': selected_fruits})
配置settings.py
'DIRS': [os.path.join(BASE_DIR,'templates')],# 指定templates的路径

总结

本文主要是Django系列博客。本文是Django创建应用过程。
1.创建app
2.修改视图views.py
3.修改Django项目下的urls.py文件
4.创建templates目录,在templates目录下添加模板页index.html
5.配置settings.py
6.项目运行

03表生成模型

创建应用

django-admin startapp polls

在templates目录下

登录页面login.html
注册页面register.html,

创建templates/polls目录。在polls目录下创建

展示学科的页面subjects.html
显示学科老师的页面teachers.html

配置关系型数据库MySQL

创建数据库/用户

1.在MySQL中创建数据库,创建用户,授权用户访问该数据库。

create database vote default charset utf8;
create user 'django'@'%' identified by 'django123';
grant all privileges on vote.* to 'django'@'%';
flush privileges;
创建表

2.在MySQL中创建保存学科和老师信息的二维表(保存用户信息的表稍后处理)。

use vote;

-- 创建学科表
create table `tb_subject`
(
	`no` integer auto_increment comment '学科编号',
    `name` varchar(50) not null comment '学科名称',
    `intro` varchar(1000) not null default '' comment '学科介绍',
    `is_hot` boolean not null default 0 comment '是不是热门学科',
    primary key (`no`)
);
-- 创建老师表
create table `tb_teacher`
(
    `no` integer 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 '' 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`)
);
安装MySQL依赖
pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple
修改settings.py文件 添加应用 配置数据库

修改项目的settings.py文件,首先将我们创建的应用polls添加已安装的项目(INSTALLED_APPS)中,然后配置MySQL作为持久化方案。

INSTALLED_APPS = [
    # 新增polls
    'polls',
]

DATABASES = {
    'default': {
        # 数据库引擎配置
        'ENGINE': 'django.db.backends.mysql',
        # 数据库的名字
        'NAME': 'vote',
        # 数据库服务器的IP地址(本机可以写localhost或127.0.0.1)
        'HOST': 'localhost',
        # 启动MySQL服务的端口号
        'PORT': 3306,
        # 数据库用户名和口令
        'USER': 'django',
        'PASSWORD': 'django123',
        # 数据库使用的字符集
        'CHARSET': 'utf8',
        # 数据库时间日期的时区设定
        'TIME_ZONE': 'Asia/Shanghai',
    }
}
基于数据库生成实体类

Django框架提供了ORM来解决数据持久化问题,ORM翻译成中文叫“对象关系映射”。利用Django的ORM,我们可以直接将刚才创建的学科表和老师表变成Django中的模型类。

python manage.py inspectdb > polls/models.py

在polls/models.py中生成如下代码,我们可以修改实体类,

from django.db import models

# Create your models here.
# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.



# 添加了注释部分verbose_name="名称"
class Subject(models.Model): # TbSubject 修改为 Subject
    no = models.AutoField(primary_key=True,verbose_name="编号")
    name = models.CharField(max_length=50,verbose_name="名称")
    intro = models.CharField(max_length=1000,verbose_name="介绍")
    is_hot = models.IntegerField(verbose_name="是否热门")

    class Meta:
        managed = False 
        db_table = 'tb_subject'
 

class Teacher(models.Model): # TbTeacher修改为Teacher
    no = models.AutoField(primary_key=True,verbose_name="编号")
    name = models.CharField(max_length=20,verbose_name="教师姓名")
    sex = models.IntegerField(verbose_name="性别")
    birth = models.DateField(verbose_name="出生年月")
    intro = models.CharField(max_length=1000,verbose_name="个人介绍")
    photo = models.CharField(max_length=255,verbose_name="照片")
    good_count = models.IntegerField(db_column="gcount",verbose_name="好评数") # gcount 修改为good_count
    bad_count= models.IntegerField(db_column="bcount",verbose_name="差评数") # bcount 修改为bad_count 添加db_column
    subject = models.ForeignKey(Subject, models.DO_NOTHING, db_column='sno') # sno 修改为 subject, TbSubject修改为Subject

    class Meta:
        managed = False
        db_table = 'tb_teacher'

使用ORM完成模型的CRUD操作

在终端中输入下面的命令进入到Django项目的交互式环境,然后尝试对模型的操作。

python manage.py shell
新增
from polls.models import Subject,Teacher

subject1 = Subject(name='Python全栈开发', intro='当下最热门的学科', is_hot=True)
subject1.save()
subject2 = Subject(name='全栈软件测试', intro='学习自动化测试的学科', is_hot=False)
subject2.save()
subject3 = Subject(name='JavaEE分布式开发', intro='基于Java语言的服务器应用开发', is_hot=True)
subject3.save()
subject = Subject.objects.get(no=1)
t1 = Teacher(name='甲1', sex="1",birth="2000-05-02",photo="照片路径",good_count="11",bad_count="0",intro='数学老师', subject=subject )
t1.save()
删除
subject = Subject.objects.get(no=2)
subject.delete()
# (1, {'polls.Subject': 1})
更新
subject = Subject.objects.get(no=1)
subject.name = 'Python全栈+人工智能'
subject.save()
查询
  1. 查询所有对象。

    Subject.objects.all()
    # <QuerySet [<Subject: Subject object (1)>, <Subject: Subject object (3)>]>
    
  2. 过滤数据。

    # 查询名称为“Python全栈+人工智能”的学科
    Subject.objects.filter(name='Python全栈+人工智能')
    # <QuerySet [<Subject: Subject object (1)>]>
    
    # 查询名称包含“全栈”的学科(模糊查询)
    Subject.objects.filter(name__contains='全栈')
    # <QuerySet [<Subject: Subject object (1)>]>
    Subject.objects.filter(name__startswith='全栈')
    # <QuerySet []>
    Subject.objects.filter(name__endswith='全栈')
    # <QuerySet []>
    
    # 查询所有热门学科
    Subject.objects.filter(is_hot=True)
    # <QuerySet [<Subject: Subject object (1)>, <Subject: Subject object (3)>]>
    
    # 查询编号大于3小于10的学科
    Subject.objects.filter(no__gt=3).filter(no__lt=10)
    # <QuerySet []>
    Subject.objects.filter(no__gt=3, no__lt=10)
    # <QuerySet []>
    
    # 查询编号在3到7之间的学科
    Subject.objects.filter(no__gte=3, no__lte=7)
    # <QuerySet [<Subject: Subject object (3)>]>
    Subject.objects.filter(no__range=(3, 7))
    # <QuerySet [<Subject: Subject object (3)>]>
    
  3. 查询单个对象。

    # 查询主键为1的学科
    Subject.objects.get(pk=1)
    # <Subject: Subject object (1)>
    Subject.objects.get(no=1)
    # <Subject: Subject object (1)>
    Subject.objects.filter(no=1).first()
    # <Subject: Subject object (1)>
    Subject.objects.filter(no=1).last()
    # <Subject: Subject object (1)>
    
  4. 排序。

    # 查询所有学科按编号升序排列
    Subject.objects.order_by('no')
    # <QuerySet [<Subject: Subject object (1)>, <Subject: Subject object (3)>]>
    
    # 查询所有部门按部门编号降序排列
    Subject.objects.order_by('-no')
    # <QuerySet [<Subject: Subject object (3)>, <Subject: Subject object (1)>]>
    
  5. 切片(分页查询)。

    # 按编号从小到大查询前3个学科
    Subject.objects.order_by('no')[:3]
    # <QuerySet [<Subject: Subject object (1)>, <Subject: Subject object (3)>]>
    
  6. 计数。

    # 查询一共有多少个学科
    Subject.objects.count()
    # 2
    
  7. 高级查询。

    # 查询编号为1的学科的老师
    Teacher.objects.filter(subject__no=1)
    # <QuerySet [<Teacher: Teacher object (1)>, <Teacher: Teacher object (3)>]>
    
    Subject.objects.get(pk=1).teacher_set.all() 
    # Subject.objects.get(pk=1).teacher_set.all() 
    
    # 查询学科名称有“全栈”二字的学科的老师
    Teacher.objects.filter(subject__name__contains='全栈') 
    # <QuerySet [<Teacher: Teacher object (1)>, <Teacher: Teacher object (3)>]>
    

    说明1:由于老师与学科之间存在多对一外键关联,所以能通过学科反向查询到该学科的老师(从一对多关系中“一”的一方查询“多”的一方),反向查询属性默认的名字是类名小写_set(如上面例子中的teacher_set),当然也可以在创建模型时通过ForeingKey的related_name属性指定反向查询属性的名字。如果不希望执行反向查询可以将related_name属性设置为’+‘或者以’+'开头的字符串。
    说明2:ORM查询多个对象时会返回QuerySet对象,QuerySet使用了惰性查询,即在创建QuerySet对象的过程中不涉及任何数据库活动,等真正用到对象时(对QuerySet求值)才向数据库发送SQL语句并获取对应的结果,这一点在实际开发中需要引起注意!
    说明3:如果希望更新多条数据,不用先逐一获取模型对象再修改对象属性,可以直接使用QuerySet对象的update()方法一次性更新多条数据。

实现学科页和老师页效果

修改polls/views.py文件,编写视图函数实现对学科页和老师页的渲染。
from django.shortcuts import render, redirect

from polls.models import Subject, Teacher


def show_subjects(request):
    subjects = Subject.objects.all().order_by('no')
    return render(request, 'polls/subjects.html', {'subjects': subjects})

def show_teachers(request):
    try:
        sno = int(request.GET.get('sno'))
        teachers = []
        if sno:
            subject = Subject.objects.only('name').get(no=sno)
            teachers = Teacher.objects.filter(subject=subject).order_by('no')
        return render(request, 'polls/teachers.html', {
            'subject': subject,
            'teachers': teachers
        })
    except (ValueError, Subject.DoesNotExist):
        return redirect('/')
创建header.html文件
<div class="user">
    {% if request.session.userid %}
    <span>{{ request.session.username }}</span>
    <a href="/logout">注销</a>
    {% else %}
    <a href="/login">登录</a>&nbsp;&nbsp;
    {% endif %}
    <a href="/register">注册</a>
</div>
修改templates/subjects.html和templates/teachers.html模板页。

subjects.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学科信息</title>
    <style>
        #container {
            width: 80%;
            margin: 10px auto;
        }
        .user {
            float: right;
            margin-right: 10px;
        }
        .user>a {
            margin-right: 10px;
        }
        #main>dl>dt {
            font-size: 1.5em;
            font-weight: bold;
        }
        #main>dl>dd {
            font-size: 1.2em;
        }
        a {
            text-decoration: none;
            color: darkcyan;
        }
    </style>
</head>
<body>
    {% include 'header.html' %}
    <div id="container">
        <!-- <div class="user">
            <a href="/login">用户登录</a>
            <a href="/register">快速注册</a>
        </div> -->
        <h1>XX学堂所有学科</h1>
        <hr>
        <a href="/excel">教师信息下载</a>
        <div id="main">
            {% for subject in subjects %}
            <dl>
                <dt>
                    <a href="/teachers/?sno={{ subject.no }}">{{ subject.name }}</a>
                    {% if subject.is_hot %}
                    <img src="/static/images/hot-icon-small.png">
                    {% endif %}
                </dt>
                <dd>{{ subject.intro }}</dd>
            </dl>
            {% endfor %}
        </div>
    </div>
</body>
</html>

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;
        }
    </style>
</head>
<body>
    {% include 'header.html' %}
    <a href="/get_echarts">教师好评分析</a>
    <div id="container">
        <h1>{{ subject.name }}学科的老师信息</h1>
        <hr>
        {% if not teachers %}
            <h2>暂无该学科老师信息</h2>
        {% endif %}
        {% 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="/praise/?tno={{ teacher.no }}">好评</a>&nbsp;&nbsp;
                    (<strong>{{ teacher.good_count }}</strong>)
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <a href="/criticize/?tno={{ teacher.no }}">差评</a>&nbsp;&nbsp;
                    (<strong>{{ teacher.bad_count }}</strong>)
                </div>
            </div>
        </div>
        {% endfor %}
        <a href="/">返回首页</a>
    </div>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <script>
        $(() => {
            $('.comment>a').on('click', (evt) => {
                evt.preventDefault()
                let url = $(evt.target).attr('href')
                $.getJSON(url, (json) => {
                    if (json.code == 20000) {
                        $(evt.target).next().text(json.count)
                    } else {
                        alert(json.mesg)
                    }
                })
            })
        })
    </script>
</body>
</html>
修改vote/urls.py文件,实现映射URL。
from django.contrib import admin
from django.urls import path

from polls import views as polls_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', polls_views.show_subjects),
    path('teachers/', polls_views.show_teachers),
]

到此为止,页面上需要的图片(静态资源)还没有能够正常展示,我们在下一章节中为大家介绍如何处理模板页上的需要的静态资源。

运行测试

python manage.py runserver

本文主要是Django系列博客。本文是Django模型层models的使用过程。
1.创建数据库
2.创建表
3.按照MySQL依赖
4.修改settings.py文件,添加应用配置数据库
5.基于数据库生成实体类
6.使用shell完成CRUD操作

04基于admin管理

利用Django后台管理模型

1.将admin应用所需的表迁移到数据库中。
python manage.py makemigrations
python manage.py migrate
2.创建访问admin应用的超级用户账号。
python manage.py createsuperuser
3.运行项目
python manage.py runserver
http://127.0.0.1:8000/admin		#在浏览器中访问
4.注册模型类

我们暂时还没能在admin应用中看到之前创建的模型类,为此需要在polls应用的admin.py文件中对需要管理的模型进行注册。

from django.contrib import admin

from polls.models import Subject, Teacher

admin.site.register(Subject)
admin.site.register(Teacher)
#刷新再访问就有了
http://127.0.0.1:8000/admin

注册模型类后,就可以在后台管理系统中看到它们。可以在管理员平台对模型进行C(新增)、R(查看)、U(更新)、D(删除)操作。

5.对模型进行CRUD操作。

注册模型管理类。

可能大家已经注意到了,刚才在后台查看部门信息的时候,显示的部门信息并不直观,为此我们再修改admin.py文件,通过注册模型管理类,可以在后台管理系统中更好的管理模型。

from django.contrib import admin

from polls.models import Subject, Teacher


class SubjectModelAdmin(admin.ModelAdmin):
    list_display = ('no', 'name', 'intro', 'is_hot')
    search_fields = ('name', )
    ordering = ('no', )


class TeacherModelAdmin(admin.ModelAdmin):
    list_display = ('no', 'name', 'sex', 'birth', 'good_count', 'bad_count', 'subject')
    search_fields = ('name', )
    ordering = ('no', )


admin.site.register(Subject, SubjectModelAdmin)
admin.site.register(Teacher, TeacherModelAdmin)

为了更好的查看模型,我们为Subject类和Teacher类添加str魔法方法,并在该方法中返回学科名字。

def __str__(self) -> str:
	return self.name
6.实现学科页和老师页效果
1.修改polls/views.py文件。
from django.shortcuts import render
from django.shortcuts import redirect

# Create your views here.

from polls.models import Subject, Teacher


def show_subjects(request):
    subjects = Subject.objects.all().order_by('no')
    return render(request, 'polls/subjects.html', {'subjects': subjects})


def show_teachers(request):
    try:
        sno = int(request.GET.get('sno'))
        teachers = []
        if sno:
            subject = Subject.objects.only('name').get(no=sno)
            teachers = Teacher.objects.filter(subject=subject).order_by('no')
        return render(request, 'polls/teachers.html', {
            'subject': subject,
            'teachers': teachers
        })
    except (ValueError, Subject.DoesNotExist):
        return redirect('/')
2.修改templates/polls/subjects.html和teachers.html模板页

请按照第三章编写HTML模板

访问

http://127.0.0.1:8000/

django模块介绍

django.shortcuts.render
render(request, template_name, context=None,content_type=None, status=None, using=None
django.shortcuts.redirect
redirect(to, *args, permanent=False, **kwargs)

总结

本文主要是Django系列博客。本文是Django模型层models的使用过程。
1.基于实体类生成数据表
python manage.py makemigrations
python manage.py migrate
2.创建超级用户
python manage.py createsuperuser
3.把models交给后台admin管理 可优化
admin.site.register(Subject)
4.修改polls/views.py文件
5.修改templates/polls下的html文件
6.运行项目
python manage.py runserver

05静态资源和Ajax请求

Django实践-04静态资源配置

创建静态资源目录

在djangoproject项目中,我们将静态资源置于名为static的文件夹中,在该文件夹包含了三个子文件夹:css、js和images,分别用来保存外部CSS文件、外部JavaScript文件和图片资源

修改settings.py文件

*为了能够找到保存静态资源的文件夹,我们还需要修改Django项目的配置文件settings.py,如下所示:

STATIC_URL = 'static/'
# 指定静态文件的存放路径,新增部分
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR),
]

Django实践-04用Ajax实现投票功能

修改项目的urls.py文件

下面,我们使用Ajax技术来实现投票的功能,首先修改项目的urls.py文件,为“好评”和“差评”功能映射对应的URL。

from django.contrib import admin
from django.urls import path

from django.contrib import admin
from django.urls import path

from polls import views as polls_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', polls_views.show_subjects),# 学科首页
    path('teachers/', polls_views.show_teachers), # 教师
    path('praise/', polls_views.praise_or_criticize), # 本部分新增 好评
    path('criticize/', polls_views.praise_or_criticize),# 本部分新增 差评
]
修改polls/views.py文件

设计视图函数praise_or_criticize来支持“好评”和“差评”功能,该视图函数通过Django封装的JsonResponse类将字典序列化成JSON字符串作为返回给浏览器的响应内容。

from django.http import JsonResponse

def praise_or_criticize(request):
    """好评"""
    try:
        tno = int(request.GET.get('tno'))
        teacher = Teacher.objects.get(no=tno)
        if request.path.startswith('/praise'):
            teacher.good_count += 1
            count = teacher.good_count
        else:
            teacher.bad_count += 1
            count = teacher.bad_count
        teacher.save()
        data = {'code': 20000, 'mesg': '操作成功', 'count': count}
    except (ValueError, Teacher.DoseNotExist):
        data = {'code': 20001, 'mesg': '操作失败'}
    return JsonResponse(data)
修改显示老师信息的模板页polls/teachers.html

请参考第三节模板内容

总结

本文主要是Django系列博客。本文是Django静态资源与Ajax请求示例。
1.创建静态资源目录
2.配置settings.py文件
3.修改urls.py文件
4.修改views.py文件
5.修改teachers.html文件

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值