ORM版学员管理系统

班级表

表结构

  1. class Class(models.Model):
  2. id = models.AutoField(primary_key=True) # 主键
  3. cname = models.CharField(max_length=32) # 班级名称
  4. first_day = models.DateField() # 开班时间

查询班级

URL部分:

  1. url(r'^class_list/$', views.class_list, name="class_list"),

视图部分:

  1. def class_list(request):
  2. class_list = models.Class.objects.all()
  3. return render(request, "class_list.html", {"class_list": class_list})

HTML部分:

  1. <table border="1">
  2. {% for class in class_list %}
  3. <tr>
  4. <td>{{ forloop.counter }}</td>
  5. <td>{{ class.id }}</td>
  6. <td>{{ class.cname }}</td>
  7. <td>{{ class.first_day|date:'Y-m-d' }}</td>
  8. </tr>
  9. {% endfor %}
  10. </table>

新增班级

URL部分:

  1. url(r'^add_class/$', views.add_class, name="add_class"),

视图部分:

  1. def add_class(request):
  2. # 前端POST填好的新班级信息
  3. if request.method == "POST":
  4. cname = request.POST.get("cname")
  5. first_day = request.POST.get("first_day")
  6. # 还可以这么获取提交的数据,但不推荐这么写
  7. # data = request.POST.dict()
  8. # del data["csrfmiddlewaretoken"]
  9. # 创建新数据的两种方式
  10. # new_class = models.Class(cname=cname, first_day=first_day)
  11. # new_class.save()
  12. models.Class.objects.create(cname=cname, first_day=first_day)
  13. # 跳转到class_list
  14. return redirect(reverse('class_list'))
  15. # 返回添加班级的页面
  16. return render(request, "add_class.html")

HTML部分:

在班级列表页面添加一个a标签:

  1. <a href="{% url 'add_class' %}">新页面添加</a>

新添加页面:

注意 {% csrf_token %} 和 date类型的input标签。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="x-ua-compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>添加班级</title>
  8. </head>
  9. <body>
  10. <form action="{% url 'add_class' %}" method="post">
  11. {% csrf_token %}
  12. <p>班级名称:<input type="text" name="cname"></p>
  13. <p>开班日期:<input type="date" name="first_day"></p>
  14. <p>提交<input type="submit"></p>
  15. </form>
  16. </body>
  17. </html>

删除班级

URL部分:

  1. url(r'^delete_class/$', views.delete_class, name="delete_class"),

视图部分:

  1. def delete_class(request):
  2. class_id = request.GET.get("class_id")
  3. models.Class.objects.filter(id=class_id).delete()
  4. return redirect(reverse("class_list"))

HTML部分:

在班级列表页面的表格中添加删除。

  1. <a href="{% url 'delete_class' %}?class_id={{ class.id }}">删除</a>

编辑班级

URL部分:

  1. url(r'^edit_class/$', views.edit_class, name="edit_class"),

视图部分:

  1. def edit_class(request):
  2. if request.method == "POST":
  3. class_id = request.POST.get("id")
  4. cname = request.POST.get("cname")
  5. first_day = request.POST.get("first_day")
  6. models.Class.objects.create(id=class_id, cname=cname, first_day=first_day)
  7. return redirect(reverse("class_list"))
  8. class_id = request.GET.get("class_id")
  9. class_obj = models.Class.objects.filter(id=class_id)
  10. if class_obj:
  11. class_obj = class_obj[0]
  12. return render(request, "edit_class.html", {"class": class_obj})
  13. # 找不到该条记录
  14. else:
  15. return redirect(reverse("class_list"))

HTML部分:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="x-ua-compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>编辑班级</title>
  8. </head>
  9. <body>
  10. <form action="{% url 'edit_class' %}" method="post">
  11. {% csrf_token %}
  12. <input type="text" value="{{ class.id }}" style="display: none">
  13. <p>班级名称:<input type="text" name="cname" value="{{ class.cname }}"></p>
  14. <p>开班日期:<input type="date" name="first_day" value="{{ class.first_day|date:'Y-m-d' }}"></p>
  15. <p>提交<input type="submit"></p>
  16. </form>
  17. </body>
  18. </html>

补充

如果将之前的URL由 /edit_class/?class_id=n修改为 /edit_class/n/ ,视图函数和HTML部分分别应该如何修改?

URL部分:

  1. url(r'^edit_class/(\d+)$', views.edit_class, name="edit_class"),

视图部分:

  1. def edit_class(request, class_id):
  2. if request.method == "POST":
  3. cname = request.POST.get("cname")
  4. first_day = request.POST.get("first_day")
  5. models.Class.objects.create(id=class_id, cname=cname, first_day=first_day)
  6. return redirect(reverse("class_list"))
  7.  
  8. class_obj = models.Class.objects.filter(id=class_id)
  9. if class_obj:
  10. class_obj = class_obj[0]
  11. return render(request, "edit_class.html", {"class": class_obj})
  12. # 找不到该条记录
  13. else:
  14. print("没有该班级")
  15. return redirect(reverse("class_list"))

HTML部分:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="x-ua-compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>编辑班级</title>
  8. </head>
  9. <body>
  10. <form action="{% url 'edit_class' class.id %}" method="post">
  11. {% csrf_token %}
  12. <input type="text" value="{{ class.id }}" style="display: none">
  13. <p>班级名称:<input type="text" name="cname" value="{{ class.cname }}"></p>
  14. <p>开班日期:<input type="date" name="first_day" value="{{ class.first_day|date:'Y-m-d' }}"></p>
  15. <p>提交<input type="submit"></p>
  16. </form>
  17. </body>
  18. </html>

备注:

在Django的日志设置中,配置上一个名为django.db.backends的logger实例即可查看翻译后的SQL语句。

  1. import logging
  2. # 日志
  3. LOGGING = {
  4. 'version': 1, # 目前为止有且只有这一个值
  5. 'disable_existing_loggers': False, # 不禁用已经存在的logger实例
  6. # 定义一些日志的处理方式
  7. 'handlers': {
  8. 'console': {
  9. 'level': 'DEBUG', # handle的日志级别
  10. 'class': 'logging.StreamHandler',
  11. },
  12. },
  13. 'loggers': {
  14. 'django.db.backends': {
  15. 'handlers': ['console'],
  16. 'propagate': True, # 向上传导
  17. 'level': 'DEBUG', # logger实例的日志级别
  18. },
  19. }
  20. }

Django项目完整版LOGGING配置:

  1. LOGGING = {
  2. 'version': 1,
  3. 'disable_existing_loggers': False,
  4. 'formatters': {
  5. 'standard': {
  6. 'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
  7. '[%(levelname)s][%(message)s]'
  8. },
  9. 'simple': {
  10. 'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  11. },
  12. 'collect': {
  13. 'format': '%(message)s'
  14. }
  15. },
  16. 'filters': {
  17. 'require_debug_true': {
  18. '()': 'django.utils.log.RequireDebugTrue',
  19. },
  20. },
  21. 'handlers': {
  22. 'console': {
  23. 'level': 'DEBUG',
  24. 'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
  25. 'class': 'logging.StreamHandler',
  26. 'formatter': 'simple'
  27. },
  28. 'default': {
  29. 'level': 'INFO',
  30. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
  31. 'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
  32. 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
  33. 'backupCount': 3,
  34. 'formatter': 'standard',
  35. 'encoding': 'utf-8',
  36. },
  37. 'error': {
  38. 'level': 'ERROR',
  39. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
  40. 'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件
  41. 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
  42. 'backupCount': 5,
  43. 'formatter': 'standard',
  44. 'encoding': 'utf-8',
  45. },
  46. 'collect': {
  47. 'level': 'INFO',
  48. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
  49. 'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
  50. 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
  51. 'backupCount': 5,
  52. 'formatter': 'collect',
  53. 'encoding': "utf-8"
  54. }
  55. },
  56. 'loggers': {
  57. # 默认的logger应用如下配置
  58. '': {
  59. 'handlers': ['default', 'console', 'error'], # 上线之后可以把'console'移除
  60. 'level': 'DEBUG',
  61. 'propagate': True,
  62. },
  63. # 名为 'collect'的logger还单独处理
  64. 'collect': {
  65. 'handlers': ['console', 'collect'],
  66. 'level': 'INFO',
  67. }
  68. },
  69. }
  70.  
  71. Django项目常用LOGGING配置

Django项目完整版LOGGING配置

ORM-班级信息系统的更多相关文章

  1. django之ORM专项训练之图书信息系统 了不起的双下方法实战 和 分组 聚合 Q, F查询,有約束和無約束

    图书信息系统 双下方法的使用情况:要查确定的某一个对象他的属性值时, 首先获得具体对象的方法是  get()   first()   last()   获得具体对象之后,在找他的外键的属性    ge ...

  2. orm 语法 数据库连接、建表、增删改查、回滚、单键关联 、多键关联、三表关联

    1.数据库连接, #!usr/bin/env/python # -*- coding:utf-8 -*- # from wangteng import sqlalchemy from sqlalche ...

  3. 【ORM】--FluentNHibernate之基本映射详解

           最近在做项目的时候用到了NHibernate,使用它并不困难,但是很麻烦.如果我的数据库有几百张表如果想要一个个的映射岂不是很麻烦,所以这种情况下使用NHibernate就会很笨重,虽然 ...

  4. Android 学习笔记之AndBase框架学习(五) 数据库ORM..注解,数据库对象映射...

    PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用 ...

  5. 是时候改变你的开发方式了-XAF信息系统快速框架介绍

    我是一名.Net开发者,从DOS时代Turbo c 算起(1996年),马上满20年了.想想写过的代码真是不少,却做了很多重复反复的编码工作.当然中间也带过团队做过几个大项目,但是代码仍没写够,还是每 ...

  6. python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy

    内容一览: 1.Python操作MySQL数据库 2.ORM sqlalchemy学习 1.Python操作MySQL数据库 2. ORM sqlachemy 2.1 ORM简介 对象关系映射(英语: ...

  7. 对象-关系映射ORM(Object Relational Mapping)(转)

    ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现 Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java).映射文件(*.hbm.xml)和数据库配置文件 ...

  8. 那些年被我坑过的Python——牵一发动全身 第十一章MySQL、ORM

    #!/usr/bin/env python # -*- coding:utf-8 -*- __Author__ = "Zhang Xuyao" from sqlalchemy im ...

  9. python 之路,Day11 (下)- sqlalchemy ORM

    python 之路,Day11 - sqlalchemy ORM   本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ...

  10. 自定义ORM框架(转转)

    ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...

随机推荐

  1. 关于<!DOCTYPE html>的学习(转)

    DOCTYPE是对Document type的缩写,说明用XHTML或者HTML是什么版本的.必须出现在<html>标签的前面,不需要关闭标签. <!DOCTYPE>声明不是标 ...

  2. iOS-SDWebImage的原理以及使用流程

    SDWebImage 支持异步的图片下载+缓存,提供了 UIImageView+WebCacha 的 category,方便使用.SDWebImage加载图片的流程: 1. 入口 setImageWi ...

  3. STL中list的erase()方法

    http://www.cnblogs.com/gshlsh17/ rase()方法是删除iterator指定的节点  但是要注意的是在执行完此函数的时候iterator也被销毁了   这样的话关于it ...

  4. php 将数组存入cookie

    最近在做一个购物车的功能,需要将商品的ID和商品数量存入cookie,实际上,cookie是不能存数组的,因此需要用到序列化函数serialize() 函数解释: serialize()就是将PHP中 ...

  5. Concurrent.util中的一些类

    package com.bjsxt.height.concurrent019; import java.io.IOException; import java.util.Random; import ...

  6. 关于IE缓存

    为了提高访问网页的速度,Internet Explorer浏览器会采用累积式加速的方法,将你曾经访问的网页内容(包括图片以及cookie文件等)存放在电脑里.这个存放空间,我们就称它为IE缓存.以后我 ...

  7. 【题解】SDOI2014旅行

    洛谷P3313 大概是一道树链剖分的裸题.可以看出如果不是查询相同宗教的这一点,就和普通的树链剖分毫无两样了.所以针对每一个宗教都单独开一棵线段树,变成单点修改+区间查询.只不过宗教数目很多,空间消耗 ...

  8. [NOI2017]游戏 2-sat

    ---题面--- 题解: 首先观察到,如果没有x的话,这就是一个2-sat问题. 建图方式:对于限制d1 c1 d2 c2,其中d1, d2分别代表比赛编号,c1, c2代表出场的赛车. 1,如果d1 ...

  9. POJ2155 Matrix 【二维线段树】

    题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...

  10. BZOJ 3545 / 洛谷 P4197 Peaks 解题报告

    P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...