ORM之班级管理

展示学生信息(进行增删改)

URL部分

视图部分

from django.shortcuts import render, HttpResponse, redirect, reverse
from . import models


# Create your views here.
# 查询
def class_list(request):
    class_list = models.Class.objects.all()
    return render(request, "class_list.html", {"class_list": class_list})


# 添加班级
def add_class(request):
    if request.method == "POST":
        cname = request.POST.get("cname")
        first_day = request.POST.get("first_day")
        models.Class.objects.create(cname=cname, first_day=first_day)
        return redirect(reverse("class_list"))
    return render(request, "add_class.html")

# 删除班级
def delete_class(request):
    class_id = request.GET.get("class_id")

    models.Class.objects.get(id=class_id).delete()
    return redirect(reverse("class_list"))

# 编辑班级
def edit_class(request, id):
    if request.method == "POST":
        # id = request.POST.get("id")
        cname = request.POST.get("cname")
        first_day = request.POST.get("first_day")
        class_obj=models.Class.objects.get(id=id)
        class_obj.cname=cname
        class_obj.first_day=first_day
        class_obj.save()
        # models.Class.objects.filter(id=id).update(cname=cname, first_day=first_day)
        return redirect(reverse("class_list"))


    class_obj = models.Class.objects.get(id=id)
    return render(request, "edit_class.html", {"class": class_obj})

 

templates部分

#添加班级
<!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</title>
</head>
<a href="{% url "add_class" %}">添加班级</a>
<body>
<table border="1">
    <thead>
      <tr>
          <th>#</th>
          <th>id</th>
          <th>班级名称</th>
          <th> 开班日期</th>
          <th> 操作</th>
      </tr>
    </thead>
    <tbody>
    {% 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>
     <td><a href="{% url "delete_class" %}?class_id={{ class.id }}">删除</a></td>
     <td><a href="{% url "edit_class" class.id %}">编辑</a></td>
     </tr>
    {% endfor %}

    </tbody>
</table>
</body>
</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</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" value="提交"></p>
</form>
</body>
</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</title>
</head>
<body>
<form action="{% url "edit_class" class.id %}" method="post">
{% csrf_token %}

<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" value="提交"></p>
</form>
</body>
</html>
 

 单表查询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

 

单表查询之双下划线

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)

ps:

     具体操作   http://www.cnblogs.com/1996-11-01-614lb/p/7757932.html

 

django中的日志配置

 

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',
        }
    },
}
View Code

 

posted @ 2018-01-22 23:36  兰博~~  阅读(223)  评论(0编辑  收藏  举报