博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORM版学员管理系统
阅读量:5091 次
发布时间:2019-06-13

本文共 7410 字,大约阅读时间需要 24 分钟。

 

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部分:

{% for class in class_list %}
{% endfor %}
{
{ forloop.counter }}
{
{ class.id }}
{
{ class.cname }}
{
{ class.first_day|date:'Y-m-d' }}

新增班级

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标签:

新添加页面:

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

  
添加班级
{% csrf_token %}

班级名称:

开班日期:

提交

删除班级

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部分:

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

编辑班级

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部分:

  
编辑班级
{% csrf_token %}

班级名称:

开班日期:

提交

补充

如果将之前的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部分:

  
编辑班级
{% csrf_token %}

班级名称:

开班日期:

提交

单表查询API汇总

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

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

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

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

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

备注:

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

LOGGING = {    'version': 1,    'disable_existing_loggers': False,    'handlers': {        'console':{            'level':'DEBUG',            'class':'logging.StreamHandler',        },    },    'loggers': {        'django.db.backends': {            'handlers': ['console'],            'propagate': True,            'level':'DEBUG',        },    }}

 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配置

 

转载于:https://www.cnblogs.com/liwenzhou/p/8325928.html

你可能感兴趣的文章
单反画质总排名,你的单反排第几呢?
查看>>
修改镜像地址加快Ubuntu更新速度
查看>>
git 入门基本命令
查看>>
要做的决定
查看>>
css3滚动提示
查看>>
Nginx Web服务应用
查看>>
python入门之socket代码练习
查看>>
网络设备配置与管理(华为)基础系列 20190411
查看>>
android用于打开各种文件的intent
查看>>
Java语言的垃圾回收机制
查看>>
eclipse运行不走debug断点
查看>>
C#MD5为密码加密
查看>>
newlisp的lambda表达式
查看>>
源代码管理十诫
查看>>
socket粘包实例个人理解
查看>>
leapmotion 初识
查看>>
【安卓5】高级控件——ListActivity
查看>>
Windows虚拟机中无法传输Arduino程序的问题
查看>>
可选参数的函数还可以这样设计!
查看>>
走高端树品牌 IT大佬竞相“归田”
查看>>