#FBV接口开发:用函数实现的view 叫做FBV
import datetime
from itertools import chain
from django.core.paginator import Paginator
from django.http import JsonResponse, QueryDict, HttpResponse
from django.shortcuts import render
from . import models
from .forms import ParameterForm
# Create your views here.
def model_to_dict(instance, fields=None, exclude=None):
opts = instance._meta
data = {}
for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
if fields and f.name not in fields:
continue
if exclude and f.name in exclude:
continue
value = f.value_from_object(instance)
if isinstance(value, datetime.datetime):
value = value.strftime('%Y-%m-%d %H:%M:%S')
if isinstance(value, datetime.date):
value = value.strftime('%Y-%m-%d')
data[f.name] = value
return data
#FBV
def f_parameter(requests):
if requests.method == 'GET':
#get请求时 获取传递过来的第几页数据
page = requests.GET.get('page')
qs = models.Parameter.bojects.filter(is_delete=0)
page_obj = Paginator(qs,5)
#获取第几页的数据
page_data = page_obj.get_page(page)
#用于存储返回的dict类型数据
data_list = []
for data in page_data:
#tongguo model_to_dict转换成dict,exclude过滤哪些字段
tmp_data = model_to_dict(data,exclude=['is_delete'])
data_list.append(tmp_data)
return JsonResponse({"code":0,"data":data_list})
elif requests.method == 'POST':
# 通过form进行数据验证
form_obj = ParameterForm(requests.POST)
#数据验证是否通过
if form_obj.is_valid():
models.Parameter.objects.create(**form_obj.cleaned_data)
return JsonResponse({"code":200,"msg":"成功"})
else:
return JsonResponse({"code":500, "msg": form_obj.errors.get_json_data()})
#form_obj.cleaned_data是所有验证通过的数据
elif requests.method == 'PUT':
# django并没有处理PUT的数据,实际上put传过来的数据在request.body
# 需要导入 from django.http import QueryDict 来处理数据
put_data = QueryDict(requests.body)
#获取需要更新哪天数据的主键
p_id = put_data.get('id')
#通过id 从数据库中取这条数据
data_obj = models.Parameter.objects.get(id=p_id)
#参数1是前端传过来的数据,参数2是数据库中获取的数据
form_obj = ParameterForm(put_data,instance=data_obj)
if form_obj.is_valid():
# 通过form的save方法进行数据更新
form_obj.save()
return JsonResponse({"code":200,"msg":"成功"})
else:
return JsonResponse({"code":"500","msg":form_obj.errors.get_json_data()})
elif requests.method == 'DELETE':
p_id = requests.GET.get('id')
#删除时,要知道删除的是哪条数据,获取主键id
#1-逻辑删除,改变字段状态
models.Parameter.objects.filter(id=p_id).update(is_delete=1) #这种方式不会触发updatetime
#可以触发updatetime方式
obj = models.Parameter.objects.filter(id=p_id).first()
obj.is_delete = 1
obj.save()
#2-物理删除,直接将数据delete掉
models.Parameter.objects.filter(id=p_id).delete()
return JsonResponse({"msg":"delete"})
else:
return HttpResponse("errors")#models.py数据:from django.db import modelsclass BaseModel(models.Model): '''公共字段''' is_delete_choice = ( (1, '删除'), (0, '正常') ) is_delete = models.SmallIntegerField(choices=is_delete_choice, default=0, verbose_name='是否被删除') create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # auto_now_add的意思,插入数据的时候,自动取当前时间 update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True) # 修改数据的时候,时间会自动变 class Meta: abstract = True # 只是用来继承的,不会创建这个表class Parameter(BaseModel): name = models.CharField(max_length=200, verbose_name='参数名', unique=True) desc = models.CharField(max_length=200, verbose_name='描述') value = models.CharField(max_length=200, verbose_name='参数值') def __str__(self): return self.name class Meta: # django admin verbose_name = '全局参数表' verbose_name_plural = verbose_name db_table = 'parameter' # 最后创建的在最上面 ordering = ['-id']#forms.py数据:from django import formsfrom django.forms import ModelFormfrom example import modelsclass ParameterForm(forms,ModelForm): class Meta: model = models.Parameter exclude = ['id','is_delete','update_time','create_time']
#CBV接口开发方式: class Base view,通过class 可以 用到继承 多继承 面向对像
#CBV的视图
class Parameter(View):
def get(self,requests):
# get请求时 获取传递过来的第几页数据
page = requests.GET.get('page')
qs = models.Parameter.bojects.filter(is_delete=0)
page_obj = Paginator(qs, 5)
# 获取第几页的数据
page_data = page_obj.get_page(page)
# 用于存储返回的dict类型数据
data_list = []
for data in page_data:
# 通过 model_to_dict转换成dict,exclude过滤哪些字段
tmp_data = model_to_dict(data, exclude=['is_delete'])
data_list.append(tmp_data)
return JsonResponse({"code": 0, "data": data_list})
def post(self,requests):
# 通过form进行数据验证
form_obj = ParameterForm(requests.POST)
# 数据验证是否通过
if form_obj.is_valid():
models.Parameter.objects.create(**form_obj.cleaned_data)
return JsonResponse({"code": 200, "msg": "成功"})
else:
return JsonResponse({"code": 500, "msg": form_obj.errors.get_json_data()})
# form_obj.cleaned_data是所有验证通过的数据
def put(self,requests):
# django并没有处理PUT的数据,实际上put传过来的数据在request.body
# 需要导入 from django.http import QueryDict 来处理数据
put_data = QueryDict(requests.body)
# 获取需要更新哪天数据的主键
p_id = put_data.get('id')
# 通过id 从数据库中取这条数据
data_obj = models.Parameter.objects.get(id=p_id)
# 参数1是前端传过来的数据,参数2是数据库中获取的数据
form_obj = ParameterForm(put_data, instance=data_obj)
if form_obj.is_valid():
# 通过form的save方法进行数据更新
form_obj.save()
return JsonResponse({"code": 200, "msg": "成功"})
else:
return JsonResponse({"code": "500", "msg": form_obj.errors.get_json_data()})
def delete(self,requests):
p_id = requests.GET.get('id')
# 删除时,要知道删除的是哪条数据,获取主键id
# 1-逻辑删除,改变字段状态
models.Parameter.objects.filter(id=p_id).update(is_delete=1) # 这种方式不会触发updatetime
# 可以触发updatetime方式
obj = models.Parameter.objects.filter(id=p_id).first()
obj.is_delete = 1
obj.save()
# 2-物理删除,直接将数据delete掉
models.Parameter.objects.filter(id=p_id).delete()
return JsonResponse({"msg": "delete"})