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>

单表查询API汇总

  1. <1> all(): 查询所有结果
  2.  
  3. <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
  4.  
  5. <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  6.  
  7. <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
  8.  
  9. <5> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
  10.  
  11. <6> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
  12.  
  13. <7> order_by(*field): 对查询结果排序
  14.  
  15. <8> reverse(): 对查询结果反向排序
  16.  
  17. <9> distinct(): 从返回结果中剔除重复纪录
  18.  
  19. <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
  20.  
  21. <11> first(): 返回第一条记录
  22.  
  23. <12> last(): 返回最后一条记录
  24.  
  25. <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False

注意:一定区分Object与QuerySet的区别 !!!

QuerySet有update方法而Object默认没有。

单表查询之神奇的双下划线

  1. models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
  2.  
  3. models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
  4. models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
  5.  
  6. models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的
  7. models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
  8.  
  9. models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and
  10.  
  11. 类似的还有:startswithistartswith, endswith, iendswith 
  12.  
  13. date字段还可以:
  14. models.Class.objects.filter(first_day__year=2017)

备注:

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

  1. LOGGING = {
  2. 'version': 1,
  3. 'disable_existing_loggers': False,
  4. 'handlers': {
  5. 'console':{
  6. 'level':'DEBUG',
  7. 'class':'logging.StreamHandler',
  8. },
  9. },
  10. 'loggers': {
  11. 'django.db.backends': {
  12. 'handlers': ['console'],
  13. 'propagate': True,
  14. 'level':'DEBUG',
  15. },
  16. }
  17. }

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. }

ORM版学员管理系统1的更多相关文章

  1. ORM版学员管理系统

    ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...

  2. ORM版学员管理系统 2

    学生信息管理 展示学生信息 URL部分 url(r'^student_list/', app01_views.student_list, name="student_list"), ...

  3. ORM版学员管理系统 3

    老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 class Class(models.Model): id = models.AutoField(primary_key=Tr ...

  4. ORM版学员管理系统3

    老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 class Class(models.Model): id = models.AutoField(primary_key=Tr ...

  5. ORM版学员管理系统2

    学生信息管理 展示学生信息 URL部分 url(r'^student_list/', app01_views.student_list, name="student_list"), ...

  6. Django之ORM版学员管理系统

    班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = models.CharF ...

  7. 老男孩Day13作业:ORM学员管理系统

    一.作业需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级      可创建指定班级的上课纪录,注意一节上 ...

  8. 【学员管理系统】0x03 老师信息管理功能

    [学员管理系统]0x03 老师信息管理功能 老师信息管理相比于学生信息管理又多了一点,因为我们的数据结构中老师表和班级表是通过teacher2class表进行多对多关联的. 写在前面 项目详细需求参见 ...

  9. Python开发程序:学员管理系统(mysql)

    主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节 ...

随机推荐

  1. Python 常见时间处理

    Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. ...

  2. https 学习笔记

    参考 : http://www.cnblogs.com/JimmyZhang/archive/2008/10/02/Cryptograph.html https://blog.csdn.net/Jog ...

  3. Java通过ftp上传文件

    首先,pom.xml添加引用 <dependency> <groupId>commons-net</groupId> <artifactId>commo ...

  4. js时间戳如何转时间

    js时间戳如何转时间 一.总结 一句话总结:Date对象分别获取年now.getFullYear()月now.getMonth()+1日now.getDate()即可 Date对象分别获取年now.g ...

  5. bzoj4516: [Sdoi2016]生成魔咒 sam

    题意:每次插入一个数字,查询本质不同的子串有多少个 题解:sam,数字很大,ch数组用map来存,每次ins之后查询一下新建点表示多少个本质不同的子串(l[np]-l[fa[np]]) /****** ...

  6. 3月25 JavaScript 练习题

    一个关于找7的题 <script type="text/javascript" language="javascript"> for(var i=1 ...

  7. leetcode-algorithms-8 String to Integer (atoi)

    leetcode-algorithms-8 String to Integer (atoi) Implement atoi which converts a string to an integer. ...

  8. 函数使用七:AUTHORITY_CHECK_RFC

    此函数是用来检查用户使用RFC函数的权限 感觉是个废物,从来没遇到过这么蛋疼的权限设置,以及这么挫的检查... Import USERID                      执行RFC函数的用 ...

  9. C# 3.0 / C# 3.5 扩展方法

    概述 扩展方法是一种特殊的静态方法,可以像扩展类型上的实例方法一样进行调用,能向现有类型“添加”方法,而无须创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法的定义实现: public s ...

  10. InnoDB存储引擎介绍-(1)InnoDB存储引擎结构

    首先以一张图简单展示 InnoDB 的存储引擎的体系架构. 从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责如下工作: 维护所有进程/线程需要访问的多个内部数 ...