ORM-班级信息系统
ORM版学员管理系统
班级表
表结构
- class Class(models.Model):
- id = models.AutoField(primary_key=True) # 主键
- cname = models.CharField(max_length=32) # 班级名称
- first_day = models.DateField() # 开班时间
查询班级
URL部分:
- url(r'^class_list/$', views.class_list, name="class_list"),
视图部分:
- def class_list(request):
- class_list = models.Class.objects.all()
- return render(request, "class_list.html", {"class_list": class_list})
HTML部分:
- <table border="1">
- {% for class in class_list %}
- <tr>
- <td>{{ forloop.counter }}</td>
- <td>{{ class.id }}</td>
- <td>{{ class.cname }}</td>
- <td>{{ class.first_day|date:'Y-m-d' }}</td>
- </tr>
- {% endfor %}
- </table>
新增班级
URL部分:
- url(r'^add_class/$', views.add_class, name="add_class"),
视图部分:
- def add_class(request):
- # 前端POST填好的新班级信息
- if request.method == "POST":
- cname = request.POST.get("cname")
- first_day = request.POST.get("first_day")
- # 还可以这么获取提交的数据,但不推荐这么写
- # data = request.POST.dict()
- # del data["csrfmiddlewaretoken"]
- # 创建新数据的两种方式
- # new_class = models.Class(cname=cname, first_day=first_day)
- # new_class.save()
- models.Class.objects.create(cname=cname, first_day=first_day)
- # 跳转到class_list
- return redirect(reverse('class_list'))
- # 返回添加班级的页面
- return render(request, "add_class.html")
HTML部分:
在班级列表页面添加一个a标签:
- <a href="{% url 'add_class' %}">新页面添加</a>
新添加页面:
注意 {% csrf_token %} 和 date类型的input标签。
- <!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">
- <title>添加班级</title>
- </head>
- <body>
- <form action="{% url 'add_class' %}" method="post">
- {% csrf_token %}
- <p>班级名称:<input type="text" name="cname"></p>
- <p>开班日期:<input type="date" name="first_day"></p>
- <p>提交<input type="submit"></p>
- </form>
- </body>
- </html>
删除班级
URL部分:
- url(r'^delete_class/$', views.delete_class, name="delete_class"),
视图部分:
- def delete_class(request):
- class_id = request.GET.get("class_id")
- models.Class.objects.filter(id=class_id).delete()
- return redirect(reverse("class_list"))
HTML部分:
在班级列表页面的表格中添加删除。
- <a href="{% url 'delete_class' %}?class_id={{ class.id }}">删除</a>
编辑班级
URL部分:
- url(r'^edit_class/$', views.edit_class, name="edit_class"),
视图部分:
- def edit_class(request):
- if request.method == "POST":
- class_id = request.POST.get("id")
- cname = request.POST.get("cname")
- first_day = request.POST.get("first_day")
- models.Class.objects.create(id=class_id, cname=cname, first_day=first_day)
- return redirect(reverse("class_list"))
- class_id = request.GET.get("class_id")
- class_obj = models.Class.objects.filter(id=class_id)
- if class_obj:
- class_obj = class_obj[0]
- return render(request, "edit_class.html", {"class": class_obj})
- # 找不到该条记录
- else:
- return redirect(reverse("class_list"))
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">
- <title>编辑班级</title>
- </head>
- <body>
- <form action="{% url 'edit_class' %}" method="post">
- {% csrf_token %}
- <input type="text" value="{{ class.id }}" style="display: none">
- <p>班级名称:<input type="text" name="cname" value="{{ class.cname }}"></p>
- <p>开班日期:<input type="date" name="first_day" value="{{ class.first_day|date:'Y-m-d' }}"></p>
- <p>提交<input type="submit"></p>
- </form>
- </body>
- </html>
补充
如果将之前的URL由 /edit_class/?class_id=n修改为 /edit_class/n/ ,视图函数和HTML部分分别应该如何修改?
URL部分:
- url(r'^edit_class/(\d+)$', views.edit_class, name="edit_class"),
视图部分:
- def edit_class(request, class_id):
- if request.method == "POST":
- cname = request.POST.get("cname")
- first_day = request.POST.get("first_day")
- models.Class.objects.create(id=class_id, cname=cname, first_day=first_day)
- return redirect(reverse("class_list"))
- class_obj = models.Class.objects.filter(id=class_id)
- if class_obj:
- class_obj = class_obj[0]
- return render(request, "edit_class.html", {"class": class_obj})
- # 找不到该条记录
- else:
- print("没有该班级")
- return redirect(reverse("class_list"))
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">
- <title>编辑班级</title>
- </head>
- <body>
- <form action="{% url 'edit_class' class.id %}" method="post">
- {% csrf_token %}
- <input type="text" value="{{ class.id }}" style="display: none">
- <p>班级名称:<input type="text" name="cname" value="{{ class.cname }}"></p>
- <p>开班日期:<input type="date" name="first_day" value="{{ class.first_day|date:'Y-m-d' }}"></p>
- <p>提交<input type="submit"></p>
- </form>
- </body>
- </html>
备注:
在Django的日志设置中,配置上一个名为django.db.backends的logger实例即可查看翻译后的SQL语句。
- import logging
- # 日志
- LOGGING = {
- 'version': 1, # 目前为止有且只有这一个值
- 'disable_existing_loggers': False, # 不禁用已经存在的logger实例
- # 定义一些日志的处理方式
- 'handlers': {
- 'console': {
- 'level': 'DEBUG', # handle的日志级别
- 'class': 'logging.StreamHandler',
- },
- },
- 'loggers': {
- 'django.db.backends': {
- 'handlers': ['console'],
- 'propagate': True, # 向上传导
- 'level': 'DEBUG', # logger实例的日志级别
- },
- }
- }
Django项目完整版LOGGING配置:
- LOGGING = {
- 'version': 1,
- 'disable_existing_loggers': False,
- 'formatters': {
- 'standard': {
- 'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
- '[%(levelname)s][%(message)s]'
- },
- 'simple': {
- 'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
- },
- 'collect': {
- 'format': '%(message)s'
- }
- },
- 'filters': {
- 'require_debug_true': {
- '()': 'django.utils.log.RequireDebugTrue',
- },
- },
- 'handlers': {
- 'console': {
- 'level': 'DEBUG',
- 'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
- 'class': 'logging.StreamHandler',
- 'formatter': 'simple'
- },
- 'default': {
- 'level': 'INFO',
- 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
- 'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
- 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
- 'backupCount': 3,
- 'formatter': 'standard',
- 'encoding': 'utf-8',
- },
- 'error': {
- 'level': 'ERROR',
- 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
- 'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件
- 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
- 'backupCount': 5,
- 'formatter': 'standard',
- 'encoding': 'utf-8',
- },
- 'collect': {
- 'level': 'INFO',
- 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
- 'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
- 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
- 'backupCount': 5,
- 'formatter': 'collect',
- 'encoding': "utf-8"
- }
- },
- 'loggers': {
- # 默认的logger应用如下配置
- '': {
- 'handlers': ['default', 'console', 'error'], # 上线之后可以把'console'移除
- 'level': 'DEBUG',
- 'propagate': True,
- },
- # 名为 'collect'的logger还单独处理
- 'collect': {
- 'handlers': ['console', 'collect'],
- 'level': 'INFO',
- }
- },
- }
- Django项目常用LOGGING配置
Django项目完整版LOGGING配置
ORM-班级信息系统的更多相关文章
- django之ORM专项训练之图书信息系统 了不起的双下方法实战 和 分组 聚合 Q, F查询,有約束和無約束
图书信息系统 双下方法的使用情况:要查确定的某一个对象他的属性值时, 首先获得具体对象的方法是 get() first() last() 获得具体对象之后,在找他的外键的属性 ge ...
- orm 语法 数据库连接、建表、增删改查、回滚、单键关联 、多键关联、三表关联
1.数据库连接, #!usr/bin/env/python # -*- coding:utf-8 -*- # from wangteng import sqlalchemy from sqlalche ...
- 【ORM】--FluentNHibernate之基本映射详解
最近在做项目的时候用到了NHibernate,使用它并不困难,但是很麻烦.如果我的数据库有几百张表如果想要一个个的映射岂不是很麻烦,所以这种情况下使用NHibernate就会很笨重,虽然 ...
- Android 学习笔记之AndBase框架学习(五) 数据库ORM..注解,数据库对象映射...
PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用 ...
- 是时候改变你的开发方式了-XAF信息系统快速框架介绍
我是一名.Net开发者,从DOS时代Turbo c 算起(1996年),马上满20年了.想想写过的代码真是不少,却做了很多重复反复的编码工作.当然中间也带过团队做过几个大项目,但是代码仍没写够,还是每 ...
- python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy
内容一览: 1.Python操作MySQL数据库 2.ORM sqlalchemy学习 1.Python操作MySQL数据库 2. ORM sqlachemy 2.1 ORM简介 对象关系映射(英语: ...
- 对象-关系映射ORM(Object Relational Mapping)(转)
ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现 Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java).映射文件(*.hbm.xml)和数据库配置文件 ...
- 那些年被我坑过的Python——牵一发动全身 第十一章MySQL、ORM
#!/usr/bin/env python # -*- coding:utf-8 -*- __Author__ = "Zhang Xuyao" from sqlalchemy im ...
- python 之路,Day11 (下)- sqlalchemy ORM
python 之路,Day11 - sqlalchemy ORM 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ...
- 自定义ORM框架(转转)
ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...
随机推荐
- 关于<!DOCTYPE html>的学习(转)
DOCTYPE是对Document type的缩写,说明用XHTML或者HTML是什么版本的.必须出现在<html>标签的前面,不需要关闭标签. <!DOCTYPE>声明不是标 ...
- iOS-SDWebImage的原理以及使用流程
SDWebImage 支持异步的图片下载+缓存,提供了 UIImageView+WebCacha 的 category,方便使用.SDWebImage加载图片的流程: 1. 入口 setImageWi ...
- STL中list的erase()方法
http://www.cnblogs.com/gshlsh17/ rase()方法是删除iterator指定的节点 但是要注意的是在执行完此函数的时候iterator也被销毁了 这样的话关于it ...
- php 将数组存入cookie
最近在做一个购物车的功能,需要将商品的ID和商品数量存入cookie,实际上,cookie是不能存数组的,因此需要用到序列化函数serialize() 函数解释: serialize()就是将PHP中 ...
- Concurrent.util中的一些类
package com.bjsxt.height.concurrent019; import java.io.IOException; import java.util.Random; import ...
- 关于IE缓存
为了提高访问网页的速度,Internet Explorer浏览器会采用累积式加速的方法,将你曾经访问的网页内容(包括图片以及cookie文件等)存放在电脑里.这个存放空间,我们就称它为IE缓存.以后我 ...
- 【题解】SDOI2014旅行
洛谷P3313 大概是一道树链剖分的裸题.可以看出如果不是查询相同宗教的这一点,就和普通的树链剖分毫无两样了.所以针对每一个宗教都单独开一棵线段树,变成单点修改+区间查询.只不过宗教数目很多,空间消耗 ...
- [NOI2017]游戏 2-sat
---题面--- 题解: 首先观察到,如果没有x的话,这就是一个2-sat问题. 建图方式:对于限制d1 c1 d2 c2,其中d1, d2分别代表比赛编号,c1, c2代表出场的赛车. 1,如果d1 ...
- POJ2155 Matrix 【二维线段树】
题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...
- BZOJ 3545 / 洛谷 P4197 Peaks 解题报告
P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...