django的排坑之路
所有项目的开始就是建表_______________建表坑一
如果有你的用户信息是后来自己想加的一定记着在setting中设置
条件:

执行

第二坑 这是十一张表里面有一个模块是没有安装的需要自己手动安装

安装过程
一.命令框输入:pip3 install multiselectfiel

二.pycharm安装
第三坑 注册逻辑中的钩子放在单另的form.py中 很多的东西需要引进来

第四坑------将登陆用中间件实现必须要 在setting中配置 还有白名单
先创建

再配置 注意:只要做中间件就要配置,切记切记!!!

五---巨大坑引入的模版
为了我们编写代码和维护代码的方便我们将前端所有用到的代码图片还有库全部放在自己建立的static文件中
1.坑一在setting中没有配置static 解决办法:

STATICFILES_DIRS=[os.path.join(BASE_DIR,"static")] 一个下划线都不能错
六.添加数据如果要用127.0.0.1/admin/坑
效果

注意在admin中的配置

admin页面的样式可以自己调节具体参考博客 https://www.cnblogs.com/haiyan123/articles/9809778.html
总结一下:
一般在数据库迁移的问题,大多都是约束条件写的不合适,首先看一看外键的位置有没有加

如果是
ManyToManyField 则不需要加
如果是在已有的表中要给定默认值或者是在里面加上两个参数

其他表结构的坑或者表结构显示的坑就要自己去踩了
七.urls中的坑 (一般在这里面坑较少,错大多都是自己写错了)

八.views中的坑(明确view的作用是用来做数据处理的,从前端页面接受请求,处理数据库中的数据返回给页面去渲染,出错多为逻辑错误) 一般在views中的逻辑用CBV去编写也就是用类的方式,这样减少代码的重复,能用组件写的就单另建一个文件夹去存放比如form组件,中间件等
views第一坑:
登陆是每一个web开发必备的当让编写的方式也是多种多样,例如:form,ModeForm,Ajax动态刷新,用户认证组件,这里登陆推荐用ajax与用户登陆认证组件做,简单,可扩展性强,安全,反应快.注册推荐用ModeForm去做,因为要渲染的东西比较多而且要用到钩子用认证组件代码复用严重而且逻辑较多,代码量大
def login(request): """ 基于Ajax和用户认证组件实现的登录功能 :param request: :return: """ if request.is_ajax(): user = request.POST.get("user") pwd = request.POST.get("pwd") validcode = request.POST.get("validcode") #请求中取验证码 # Ajax请求返回一个字典 response = {"user": None, "err_msg": ""} # 先取出验证码 判断 if validcode.upper() == request.session.get("keep_str").upper(): # 如果验证码正确 取账户信息 user_obj = auth.authenticate(username=user, password=pwd) if user_obj: auth.login(request, user_obj) # request.session["user_id"] = user_obj.pk response['user'] = user else: response['err_msg'] = "用户名或者密码错误!" else: response['err_msg'] = "验证码输入错误!" return JsonResponse(response) else: return render(request, "login.html")
# 验证码 def get_valid_img(request): def get_random_color(): """ 基于PIL获取动态验证码 """ return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) img = Image.new("RGB", (200, 35), get_random_color()) # 生成随机背景色 draw = ImageDraw.Draw(img) font = ImageFont.truetype("static/font/kumo.ttf", 32) # 生成随级4位验证码 keep_str = "" for i in range(1): random_num = str(random.randint(0, 9)) # 小写字母验证码 random_lowalf = chr(random.randint(97, 122)) # 大写字母验证码 random_upperalf = chr(random.randint(65, 90)) random_char = random.choice([random_num, random_lowalf, random_upperalf]) # 参数: 字体位置 随机数值 随机颜色 规定字体 draw.text((i * 30 + 50, 0), random_char, get_random_color(), font=font) keep_str += random_char print(keep_str) # 验证码点线干扰 width = 200 height = 35 for i in range(3): x1 = random.randint(0, width) x2 = random.randint(0, width) y1 = random.randint(0, height) y2 = random.randint(0, height) draw.line((x1, y1, x2, y2), fill=get_random_color()) for i in range(5): draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color()) x = random.randint(0, width) y = random.randint(0, height) draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color()) # 写与读-将生成的验证码图片放在缓存中 f = BytesIO() img.save(f, "png") data = f.getvalue() # 将验证码存在各自的session中 request.session['keep_str'] = keep_str return HttpResponse(data)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css"> <script src="/static/js/jquery.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-4 col-md-offset-4"> <form action="" method="post"> {% csrf_token %} <div class="form-group"> <label for="">用户名</label> <input type="text" class="form-control" id="user"> </div> <div class="form-group"> <label for="">密码</label> <input type="password" class="form-control" id="pwd"> </div> <div class="form-group"> <div class="row"> <div class="col-md-5"> <input type="text" class="form-control" id="validcode"> </div> <div class="col-md-6"> <img src="{% url 'valid_img' %}" alt="" width="200" height="35" id="valid_img"> </div> </div> </div> <div> <a href="{% url 'reg' %}" role="button" class="btn btn-primary pull-right">注册</a> <input type="button" class="btn btn-primary col-md-offset-8 login_btn" value="登录"> {# 错误信息#} <span class="error"></span> </div> </form> </div> </div> </div> <script> // Ajax登录 $(".login_btn").click(function () { $.ajax({ url: "", type: "POST", data: { user: $("#user").val(), pwd: $("#pwd").val(), validcode: $("#validcode").val(), csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val() }, success: function (response) { if (response.user) { // 登录成功 location.href = "/index/" } else { // 登录失败 $(".error").html(response.err_msg).css("color", "red") } } }) }); // 验证码刷新 $("#valid_img").click(function () { this.src += "?" }) </script> </body> </html>
第一种 登陆中的坑一般在中间件的设置上一个问题就是有些页面是要用户登陆了之后才能看的但是前面的设置中我们没有考虑这一点,处理有两种办法,第一种是加中间件这里面的坑就是设置白名单,如果把有些应该放出来的都给拦住了,那么就连登陆都进不去了中间件的相关知识可以参考 https://www.cnblogs.com/RootEvils/articles/9923742.html
第二种 用装饰器来做这种做法的好处就是灵活你只需要在要验证的逻辑前面加上登陆的装饰器
第二坑:注册逻辑之坑
####################注册页面ModelForm来做##################### def reg1(request): if request.method=="GET": form=Userinfo1ModeForm() return render(request,"reg1.html",{"form":form}) else: form=Userinfo1ModeForm(request.POST) if form.is_valid(): obj=form.save() return redirect("/login1/") else: return render(request,"reg1.html",{"form":form})
class UserInfoModeForm(forms.ModelForm): #第二次输入密码 r_pwd = forms.CharField(max_length=32, widget=widgets.PasswordInput(), label="确认密码",) class Meta: model = UserInfo fields = ["email", "username", "password",] labels = { "username": "用户名", "password": "密码", "email": "邮箱", "r_pwd": "确认密码" } error_messages = { "address": "邮箱格式错误", } widgets = { "password": widgets.TextInput(attrs={"type": "password"}), # "r_pwd": widgets.TextInput(attrs={"type": "password"}) } def __init__(self ,*args, **kwargs): super().__init__(*args, **kwargs) for filed in self.fields.values(): filed.error_messages = {"required": "内容不能位空!"} filed.widget.attrs.update({'class': 'form-control'})
验证错误尽量用钩子去验证前端也可以做验证但是不安全
def clean_username(self): val = self.cleaned_data.get('username') user = UserInfo.objects.filter(username=val).first() if user: raise ValidationError("用户已存在!") else: return val def clean_password(self): val = self.cleaned_data.get('password') print(val) if val.isdigit(): raise ValidationError("密码不能是纯数字") else: return val def clean_email(self): val = self.cleaned_data.get('email') if re.search("\w+@163.com$", val): return val else: raise ValidationError("邮件必须是163邮箱!") def clean(self): r_pwd = self.cleaned_data.get("r_pwd") password = self.cleaned_data.get('password') if password and r_pwd and password != r_pwd: self.add_error("r_pwd", ValidationError("两次输入的密码不相同!")) else: return self.cleaned_data
如果不需要用模板前端中的验证图示

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <h3>注册页面</h3> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form action="/reg1/" method="post" novalidate> {% csrf_token %} {% for field in form %} <div class="form-group"> <label for="title">{{ field.label }}</label> {{ field }} <span style="color: red">{{ field.errors.0 }}</span> </div> {% endfor %} <input type="submit" value="注册" class="btn btn-default pull-right"> </form> </div> </div> </div> </body> </html>
####################注销页面##################### def logout(request): auth.logout(request) return redirect("/login/")
第九坑 页面的增删该查 这类编辑一般都用CBV去编写将同一个类型的逻辑放在一个类下面便于维护,比如公户类(GET请求,POST请求,增删改查) 私户类(GET请求,POST请求,增删改查)
####################用户列表##################### class CustomerView(View): def get(self,request): if reverse("customers_public")== request.path: label = "全部客户" customer_list = Customer.objects.all() elif reverse("customers_list") == request.path: label="用户列表" customer_list = Customer.objects.filter(consultant__isnull=True) else: label = "个人用户" customer_list = Customer.objects.filter(consultant=request.user) # search过滤 val = request.GET.get("q") field = request.GET.get("field") if val: q = Q() q.children.append((field + "__contains", val)) customer_list = customer_list.filter(q) # customer_list=customer_list.filter(Q(name__contains=val)|Q(qq__contains=val)) # 分页 current_page_num = request.GET.get("page") pagination = Pagination(current_page_num, customer_list.count(), request) customer_list = customer_list[pagination.start:pagination.end] #获取当前登陆用户 path=request.path next="?next=%s"%path return render(request, "customer_list.html", {"next":next,"label":label,"customer_list": customer_list, "pagination": pagination}) def post(self,request): # action的批量处理 func_str=request.POST.get("action") data=request.POST.getlist("selected_pk_list") if not hasattr(self,func_str): return HttpResponse("非法输入!") else: func = getattr(self,func_str) queryset = Customer.objects.filter(pk__in=data) ret = func(request,queryset) if ret: return ret return redirect(request.path) def patch_delete(self,request,queryset): queryset.delete() def patch_reverse(self,request,queryset): ''' 公户转私户 :param data: :return: ''' ret = queryset.filter(consultant__isnull = True) if ret: ret.update(consultant = request.user) else: return HttpResponse("手速太慢 ") def patch_delete_sg(self,request,queryset): """ 私户转公户 :param request: :param queryset: :return: """ queryset.update(consultant = request.user)
####################添加和编辑用户放一起##################### from app01.form import CustomerModelForm class AddEditCustomerView(View): def get(self,request,id = None): edit_obj = Customer.objects.filter(pk = id).first() form = CustomerModelForm(instance=edit_obj) return render(request,"add_edit_customer.html",{"form":form,"edit_obj":edit_obj}) def post(self,request,id = None): edit_obj = Customer.objects.filter(pk=id).first() form = CustomerModelForm(request.POST, instance=edit_obj) if form.is_valid(): form.save() return redirect(request.GET.get("next")) else: return render(request, "add_edit_customer.html", {"form": form, "edit_obj": edit_obj}) ###################删除用户##################### def customershan(request,id): Customer.objects.filter(pk=id).delete() return redirect(request.GET.get("next"))
# 显示所有员工信息 class CustomerView(View): def get(self, request): # 如果请求是~~显示所有客户信息: if reverse("customers_list") == request.path: label = "公户列表" # 公户显示销售为空的客户 customer_list = Customer.objects.filter(consultant__isnull=True) # 取出销售(现在登录的人)的信息 else: label = "我的客户" customer_list = Customer.objects.filter(consultant=request.user) # search过滤 取出字段q val = request.GET.get('query') # field = request.GET.get("field") if val: q = Q() q.children.append((field + "__contains", val)) customer_list = customer_list.filter(q) # customer_list = customer_list.filter(Q(name__contains=val)|Q(qq__contains=val)) # 分页 current_page_num = request.GET.get("page") pagination = Pagination(current_page_num, customer_list.count(), request) customer_list = customer_list[pagination.start:pagination.end] # 获取发送请求时的路径 path = request.path next = "?next=%s" % path return render(request, "customer_list.html", {"next": next, "label": label, "customer_list": customer_list, "pagination": pagination}) def post(self, request): # action的批量处理 print(request.POST) # 取出操作键值对action func_str = request.POST.get("action") # 取出选择的数据id(checkbox框) data = request.POST.getlist("selected_pk_list") print(data) # 反射 为空 非法输入 if not hasattr(self, func_str): return HttpResponse("非法输入") else: func = getattr(self, func_str) queryset = Customer.objects.filter(pk__in=data) ret = func(request, queryset) if ret: return ret # ret = self.get(request) # return ret return redirect(request.path) def patch_delete(self, request, queryset): queryset.delete() def patch_reverse_gs(self, request, queryset): """ 公户转私户 :param request: :param queryst: :return: """ # 再次判断 在当前时间 用户是否已经被其他销售选走 ret = queryset.filter(consultant__isnull=True) if ret: ret.update(consultant=request.user) else: return HttpResponse("该用户已经被选走!") def patch_reverse_sg(self, request, queryset): """ 私户转公户 """ queryset.update(consultant=None) # 客户信息的增删改 class AddEditCustomerView(View): # 当为增时 edit_id会不存在 设置默认值为None def get(self, request, edit_id=None): edit_obj = Customer.objects.filter(pk=edit_id).first() form = CustomerModelForm(instance=edit_obj) return render(request,"add_edit_customer.html", {"form": form, "edit_obj": edit_obj}) def post(self, request, edit_id=None): edit_obj = Customer.objects.filter(pk=edit_id).first() form = CustomerModelForm(request.POST, instance=edit_obj) if form.is_valid(): form.save() return redirect(request.GET.get("next")) else: return render(request, "add_edit_customer.html", {"form": form, "edit_obj": edit_obj}) """ # 单独的客户信息的 增 和 改 class AddCustomerView(View): def get(self, request): form = CustomerModelForm() return render(request, "add_customer.html", {"form": form}) def post(self, request): form = CustomerModelForm(request.POST) if form.is_valid(): form.save() return redirect(reverse("customers_list")) else: return render(request, "add_customer.html", {"form": form}) class EditCustomerView(View): def get(self, request, id): edit_obj = Customer.objects.get(pk=id) form = CustomerModelForm(instance=edit_obj) return render(request, "edit_customer.html", {"form": form}) def post(self, request, id): edit_obj = Customer.objects.get(pk=id) form = CustomerModelForm(request.POST, instance=edit_obj) if form.is_valid(): form.save() return redirect(request.GET.get("next")) else: return render(request, "edit_customer.html", {"form": form}) """ class ConsultRecordView(View): """ 跟进信息 """ def get(self,request): consult_record_list = ConsultRecord.objects.filter(consultant=request.user) customer_id = request.GET.get("customer_id") if customer_id: consult_record_list = consult_record_list.filter(customer_id=customer_id) return render(request, "consult_record.html", locals()) class AddEditConsultRecordView(View): def get(self, request, edit_id=None): edit_obj = ConsultRecord.objects.filter(pk=edit_id).first() form = ConsultRecordModelForm(instance=edit_obj) return render(request, "add_edit_consultrecord.html", {"form": form, "edit_obj": edit_obj}) def post(self, request, edit_id=None): edit_obj = ConsultRecord.objects.filter(pk=edit_id).first() form = ConsultRecordModelForm(request.POST, instance=edit_obj) if form.is_valid(): form.save() return redirect(reverse("consult_record")) else: return render(request, "add_edit_consultrecord.html", {"form": form, "edit_obj": edit_obj}) # 班级学习记录 class ClassStudyView(View): def get(self, request): class_study_record_list = ClassStudyRecord.objects.all() return render(request, "student/class_study_record.html", locals()) def post(self, request): action = request.POST.get('action') selected_pk_list = request.POST.getlist("selected_pk_list") # 反射 执行"action"取到需要执行的方法 if hasattr(self, action): ret = getattr(self, action)(selected_pk_list) # 执行get方法: 相当于重定向 返回get页面 return self.get(request) # def patch_delete(self, request, queryset): # """ 批量删除 # """ # queryset.delete() def patch_add(self, selected_pk_list): """ 批量创建学生学习记录 """ print(selected_pk_list) try: for class_study_record_pk in selected_pk_list: class_study_record_obj = ClassStudyRecord.objects.filter(pk=class_study_record_pk).first() print(type(class_study_record_obj)) student_list = class_study_record_obj.class_obj.students.all() print("student_list", student_list) for student in student_list: StudentStudyRecord.objects.create(student=student, classstudyrecord=class_study_record_obj) except Exception as e: pass class DelClassStudyView(View): """ 删除学习记录 """ def get(self, request, id): ClassStudyRecord.objects.filter(pk=id).delete() return redirect(reverse("class_study")) class AddEditClassStudyView(View): """ 添加 或 编辑班级学习记录 """ def get(self, request): form = ClassStudyModelForm(request.GET) if form.is_valid(): form.save() return render(request, "student/add_edit_class_study.html", {"form": form}) def post(self, request): form = ClassStudyModelForm(request.POST) if form.is_valid(): form.save() return redirect(reverse("class_study")) else: return render(request, "student/add_edit_class_study.html", {"form": form}) class RecordScoreView(View): pass
from django.shortcuts import render,HttpResponse,redirect from django.contrib import auth from django.http import JsonResponse import random from app01.models import UserInfo,Customer,ConsultRecord,Enrollment,ClassStudyRecord,Student,StudentStudyRecord from app01.form import UserForm,UserinfoModeForm,Userinfo1ModeForm from django.db.models import Q from django.urls import reverse from app01.utils.page import Pagination from django.views import View from django.forms.models import modelformset_factory import json # Create your views here. ##################主页面######################## def index(request): return render(request,"index.html") ####################登陆页面##################### def login(request): if request.is_ajax(): user=request.POST.get("user") pwd=request.POST.get("pwd") validcode=request.POST.get("validcode") # Ajax 请求返回一个字典 response={"user":None,"err_msg":""} if validcode.upper() == request.session.get("keep_str").upper(): user_obj=auth.authenticate(username=user,password=pwd) if user_obj: auth.login(request,user_obj) # 登陆认证的 response["user"]=user else: response["err_msg"]="用户名或密码错误! " else: response["err_msg"] = "验证码错误! " return JsonResponse(response) else: return render(request, "login2.html") ####################登陆页面ModelForm来做##################### def login1(request): if request.method=="GET": form=UserinfoModeForm() return render(request,"login1.html",{"form":form}) else: form=UserinfoModeForm(request.POST) if form.is_valid(): return redirect("") else: return render(request,"login1.html",{"form":form}) ####################注册页面##################### def reg(request): if request.method == "POST": form = UserForm(request.POST) res = {"user": None, "err_msg": ""} if form.is_valid(): res["user"] = form.cleaned_data.get("user") user = form.cleaned_data.get("user") pwd = form.cleaned_data.get("pwd") email = form.cleaned_data.get("email") user = UserInfo.objects.create_user(username=user, password=pwd, email=email) else: res["err_msg"] = form.errors return JsonResponse(res) else: form = UserForm() return render(request,"regist.html", locals()) ####################注册页面ModelForm来做##################### def reg1(request): if request.method=="GET": form=Userinfo1ModeForm() return render(request,"reg1.html",{"form":form}) else: form=Userinfo1ModeForm(request.POST) if form.is_valid(): obj=form.save() return redirect("/login1/") else: return render(request,"reg1.html",{"form":form}) ####################验证码##################### def get_valid_img(request): from PIL import Image, ImageDraw, ImageFont #ImageDraw 图片的画笔 from io import BytesIO #内存管理 import random def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) #底色图片的生成 img = Image.new("RGB", (280, 38), get_random_color()) #创建新的图片, "RGB"-模式, (350, 38)图片的长宽 draw = ImageDraw.Draw(img) #创建画笔 font = ImageFont.truetype("static/font/kumo.ttf", 32) #字体 keep_str = "" for i in range(6): random_num = str(random.randint(0, 9)) #数字 random_lowalf = chr(random.randint(97, 122)) #小写字母 random_upperalf = chr(random.randint(65, 90)) #大写字母 random_char = random.choice([random_num, random_lowalf, random_upperalf]) draw.text((i * 30 + 50, 0), random_char, get_random_color(), font=font) keep_str += random_char f = BytesIO() #写与读 img.save(f, "png") #下载到内存中 data = f.getvalue() #在内存中读取 print('keep_str', keep_str) # 将验证码存在各自的session中 request.session['keep_str'] = keep_str return HttpResponse(data) ####################注销页面##################### def logout(request): auth.logout(request) return redirect("/login/") ####################用户列表##################### class CustomerView(View): def get(self,request): if reverse("customers_public")== request.path: label = "全部客户" customer_list = Customer.objects.all() elif reverse("customers_list") == request.path: label="用户列表" customer_list = Customer.objects.filter(consultant__isnull=True) else: label = "个人用户" customer_list = Customer.objects.filter(consultant=request.user) # search过滤 val = request.GET.get("q") field = request.GET.get("field") if val: q = Q() q.children.append((field + "__contains", val)) customer_list = customer_list.filter(q) # customer_list=customer_list.filter(Q(name__contains=val)|Q(qq__contains=val)) # 分页 current_page_num = request.GET.get("page") pagination = Pagination(current_page_num, customer_list.count(), request) customer_list = customer_list[pagination.start:pagination.end] #获取当前登陆用户 path=request.path next="?next=%s"%path return render(request, "customer_list.html", {"next":next,"label":label,"customer_list": customer_list, "pagination": pagination}) def post(self,request): # action的批量处理 func_str=request.POST.get("action") data=request.POST.getlist("selected_pk_list") if not hasattr(self,func_str): return HttpResponse("非法输入!") else: func = getattr(self,func_str) queryset = Customer.objects.filter(pk__in=data) ret = func(request,queryset) if ret: return ret return redirect(request.path) def patch_delete(self,request,queryset): queryset.delete() def patch_reverse(self,request,queryset): ''' 公户转私户 :param data: :return: ''' ret = queryset.filter(consultant__isnull = True) if ret: ret.update(consultant = request.user) else: return HttpResponse("手速太慢 ") def patch_delete_sg(self,request,queryset): """ 私户转公户 :param request: :param queryset: :return: """ queryset.update(consultant = request.user) from django import forms ####################添加用户##################### # class AddCustomerView(View): # # def get(self, request): # form = CustomerModelForm() # return render(request, "add_customer.html", {"form": form}) # # def post(self, request): # form = CustomerModelForm(request.POST) # if form.is_valid(): # form.save() # return redirect(reverse("customers_list")) # else: # return render(request, "add_customer.html", {"form": form}) ####################编辑用户##################### # class EditCustomerView(View): # def get(self, request, id): # edit_obj = Customer.objects.get(pk=id) # form = CustomerModelForm(instance=edit_obj) # return render(request, "edit_customer.html", {"form": form}) # # def post(self, request, id): # edit_obj = Customer.objects.get(pk=id) # form = CustomerModelForm(request.POST, instance=edit_obj) # if form.is_valid(): # form.save() # return redirect(request.GET.get("next")) # else: # return render(request, "edit_customer.html", {"form": form}) ####################添加和编辑用户放一起##################### from app01.form import CustomerModelForm class AddEditCustomerView(View): def get(self,request,id = None): edit_obj = Customer.objects.filter(pk = id).first() form = CustomerModelForm(instance=edit_obj) return render(request,"add_edit_customer.html",{"form":form,"edit_obj":edit_obj}) def post(self,request,id = None): edit_obj = Customer.objects.filter(pk=id).first() form = CustomerModelForm(request.POST, instance=edit_obj) if form.is_valid(): form.save() return redirect(request.GET.get("next")) else: return render(request, "add_edit_customer.html", {"form": form, "edit_obj": edit_obj}) ###################删除用户##################### def customershan(request,id): Customer.objects.filter(pk=id).delete() return redirect(request.GET.get("next")) ####################跟进记录##################### class ConsultRecordView(View): def get(self, request): consult_record_list = ConsultRecord.objects.filter(consultant=request.user) customer_id = request.GET.get("customer_id") if customer_id: consult_record_list = consult_record_list.filter(customer_id=customer_id) #分页 current_page_num = request.GET.get("page") pagination = Pagination(current_page_num, consult_record_list.count(), request) consult_record_list = consult_record_list[pagination.start:pagination.end] # name = request.user.username # val = (int(current_page_num) - 1) * 2 return render(request, "consultrecord.html", {"consult_record_list": consult_record_list,"pagination":pagination}) from app01.form import ConsultRecordModelForm ####################添加跟进记录##################### class addConsultRecordView(View): def get(self, request): form = ConsultRecordModelForm(request) return render(request, "add_consult_records.html", {"form": form}) def post(self, request): form = ConsultRecordModelForm(request.POST) if form.is_valid(): form.save() return redirect(reverse("consult_records")) else: return render(request, "add_consult_records.html", {"form": form}) ####################编辑跟进记录##################### class EditConsultRecordView(View): def get(self, request, id = None): edit_obj = ConsultRecord.objects.get(pk=id) form = ConsultRecordModelForm(request, instance=edit_obj) return render(request, "edit_consult_records.html", {"form": form}) def post(self, request, id = None): edit_obj = ConsultRecord.objects.get(pk=id) form = ConsultRecordModelForm(request.POST, instance=edit_obj) if form.is_valid(): form.save() return redirect(reverse("consult_records")) else: return render(request, "edit_consult_records.html", {"form": form}) ####################添加和编辑跟进记录##################### class AddEditConsultRecordView(View): def get(self,request,id = None): edit_obj = ConsultRecord.objects.filter(pk = id).first() form = ConsultRecordModelForm(instance=edit_obj) return render(request,"add_edit_cusltrecord.html",{"form":form,"edit_obj":edit_obj}) def post(self,request,id = None): edit_obj = ConsultRecord.objects.filter(pk = id).first() form = ConsultRecordModelForm(request.POST,instance=edit_obj) if form.is_valid(): print(form.is_valid()) form.save() return redirect(reverse("consult_records")) else: return render(request,"add_edit_cusltrecord.html",{"form":form,"edit_obj":edit_obj}) ####################删除跟进记录##################### def ConsultRecordshan(request,id): ConsultRecord.objects.filter(pk=id).delete() return redirect(reverse("consult_records")) ####################报名记录##################### class EnrollmentRecordView(View): def get(self, request): edit_obj = Enrollment.objects.all() return render(request, "enrollment.html", {"edit_obj":edit_obj}) ####################添加和编辑报名记录##################### from app01.form import EnrollmentModelForm class AddEditEnrollmentRecordView(View): def get(self,request,id = None): edit_obj = Enrollment.objects.filter(pk = id).first() form = EnrollmentModelForm(instance=edit_obj) return render(request,"add_edit_enrollment.html",{"form":form,"edit_obj":edit_obj}) def post(self, request, id = None): edit_obj = Enrollment.objects.filter(pk=id).first() form = EnrollmentModelForm(request.POST, instance=edit_obj) if form.is_valid(): form.save() return redirect(reverse("enrollment")) else: return render(request, "add_edit_enrollment.html", {"form": form, "edit_obj": edit_obj}) ####################删除报名记录##################### def ShanEnrollment(request, id): Enrollment.objects.filter(pk = id).delete() return redirect(reverse("enrollment")) ####################查看班级记录##################### class ClassStudyRecordView(View): def get(self,request): study_record = ClassStudyRecord.objects.all() return render(request,"study_record.html",{"study_record":study_record}) def post(self,request): action = request.POST.get("action") selected_pk_list = request.POST.getlist("selected_pk_list") if hasattr(self,action): ret = getattr(self,action)(selected_pk_list) return self.get(request) def patch_init(self,selected_pk_list): #批量创建学生学习记录 try: for class_study_record_pk in selected_pk_list: class_study_record_obj = ClassStudyRecord.objects.filter(pk=class_study_record_pk).first() student_list = class_study_record_obj.class_obj.students.all() for student in student_list: StudentStudyRecord.objects.create(student=student, classstudyrecord=class_study_record_obj) except Exception as e: pass ####################添加和编辑班级记录##################### from app01.form import ClassStudyRecordModelForm class addEditClassStudyRecordView(View): def get(self,request,id = None): study_record = ClassStudyRecord.objects.filter(pk=id).first() form = ClassStudyRecordModelForm(instance=study_record) return render(request,"add_edit_studyrecord.html",{"form":form,"study_record":study_record}) def post(self,request,id=None): study_record = ClassStudyRecord.objects.filter(pk=id).first() print(study_record) form = ClassStudyRecordModelForm(request.POST,instance=study_record) print(form) if form.is_valid(): form.save() return redirect(reverse("class_studyrecord")) else: return render(request,"add_edit_studyrecord.html",{"form": form, "study_record": study_record}) ####################录入成绩##################### class luruchengjiView(View): def get(self,request,id): cls_stu = ClassStudyRecord.objects.get(pk=id) student_study_list = cls_stu.studentstudyrecord_set.all() score_chices = StudentStudyRecord.score_choices return render(request,"luruchengji.html", locals()) def post(self,request,id): data_dict = {} for key,val in request.POST.items(): if key == "csrfmiddlewaretoken": continue field,pk = key.rsplit("_",1) if pk not in data_dict: data_dict[pk]={ field:val } else: data_dict[pk][field] = val for pk,data in data_dict.items(): StudentStudyRecord.objects.filter(pk=pk).update(**data) return redirect(request.path) ####################利用formset录入成绩##################### from app01.form import StudentStudyModelForm class luruchengjiView1(View): def get(self,request,class_student_record_id): cls_stu = ClassStudyRecord.objects.get(pk=class_student_record_id) model_formset_cls = modelformset_factory(model=StudentStudyRecord, form=StudentStudyModelForm, extra=0) queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_student_record_id) formset = model_formset_cls(queryset=queryset) return render(request,"luruchengji1.html", locals()) def post(self, request, class_study_record_id): model_formset_cls = modelformset_factory(model=StudentStudyRecord, form=StudentStudyModelForm, extra=0) queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_study_record_id) print(request.POST) formset = model_formset_cls(request.POST) if formset.is_valid(): formset.save() print(formset.errors) return redirect(request.path) ####################删除班级记录##################### def ShanClassStudyRecord(request,id): ClassStudyRecord.objects.filter(pk=id).delete() return redirect(reverse("class_studyrecord")) ####################查看个人课程记录##################### class StudentStudyRecordView(View): def get(self,request): student_study = StudentStudyRecord.objects.all() return render(request,"student_study.html",{"student_study":student_study}) ####################添加和编辑个人课程记录##################### from app01.form import StudentStudyRecordModelForm class addEditStudentStudyRecordView(View): def get(self,request,id=None): student_study = StudentStudyRecord.objects.filter(pk=id).first() form = StudentStudyRecordModelForm(instance=student_study) return render(request,"add_edit_studentstudy.html",{"form":form,"student_study":student_study}) def post(self,request,id=None): student_study = StudentStudyRecord.objects.filter(pk=id).first() form = StudentStudyRecordModelForm(request.POST,instance=student_study) if form.is_valid(): form.save() return redirect(reverse("student_studyrecord")) else: return render(request, "add_edit_studentstudy.html", {"form": form, "student_study": student_study}) ####################删除个人课程记录##################### def ShanStudentStudyRecord(request,id): StudentStudyRecord.objects.filter(pk=id).delete() return redirect(reverse("student_studyrecord")) from django.db.models import Count class TongJiView(View): def today(self): import datetime today=datetime.datetime.now().date() customer_list=Customer.objects.filter(deal_date=today) # 查询每一个销售的名字以及今天对应的成单量 ret=UserInfo.objects.filter(depart_id=2,customers__deal_date=today).annotate(c=Count("customers")).values_list("username","c") print(ret) ret=[[item[0],item[1]] for item in list(ret)] return {"customer_list":customer_list,"ret":list(ret)} def zuotian(self): import datetime zuotian = datetime.datetime.now().date()-datetime.timedelta(days=1) customer_list = Customer.objects.filter(deal_date=zuotian) # 查询每一个销售的名字以及昨天对应的成单量 ret = UserInfo.objects.filter(depart_id=2, customers__deal_date=zuotian).annotate( c=Count("customers")).values_list("username", "c") print(ret) print(ret) ret = [[item[0], item[1]] for item in list(ret)] return {"customer_list": customer_list, "ret": list(ret)} def week(self): import datetime today = datetime.datetime.now().date() weekdelta = datetime.datetime.now().date()-datetime.timedelta(weeks=1) customer_list = Customer.objects.filter(deal_date__gte=weekdelta,deal_date__lte=today) # 查询每一个销售的名字以及昨天对应的成单量 ret = UserInfo.objects.filter(depart_id=2, customers__deal_date__gte=weekdelta,customers__deal_date__lte=today).annotate( c=Count("customers")).values_list("username", "c") print(ret) print(ret) ret = [[item[0], item[1]] for item in list(ret)] return {"customer_list": customer_list, "ret": list(ret)} def recent_month(self): import datetime today = datetime.datetime.now().date() weekdelta = datetime.datetime.now().date()-datetime.timedelta(weeks=4) customer_list = Customer.objects.filter(deal_date__gte=weekdelta,deal_date__lte=today) # 查询每一个销售的名字以及昨天对应的成单量 ret = UserInfo.objects.filter(depart_id=2, customers__deal_date__gte=weekdelta,customers__deal_date__lte=today).annotate( c=Count("customers")).values_list("username", "c") print(ret) print(ret) ret = [[item[0], item[1]] for item in list(ret)] return {"customer_list": customer_list, "ret": list(ret)} def get(self,request): date=request.GET.get("date","today") if hasattr(self,date): context=getattr(self,date)() return render(request,"tongji.html",context)
第十坑 数据多了就需要分页(逻辑性较强)可以将其逻辑单独提出来做一个文件便于理解
class Pagination(object): def __init__(self,current_page_num,all_count,request,per_page_num=2,pager_count=11): """ 封装分页相关数据 :param current_page_num: 当前访问页的数字 :param all_count: 分页数据中的数据总条数 :param per_page_num: 每页显示的数据条数 :param pager_count: 最多显示的页码个数 """ try: current_page_num = int(current_page_num) except Exception as e: current_page_num = 1 if current_page_num <1: current_page_num = 1 self.current_page_num = current_page_num self.all_count = all_count self.per_page_num = per_page_num # 实际总页码 all_pager, tmp = divmod(all_count, per_page_num) if tmp: all_pager += 1 self.all_pager = all_pager self.pager_count = pager_count self.pager_count_half = int((pager_count - 1) / 2) # 5 # 保存搜索条件 import copy self.params=copy.deepcopy(request.GET) # {"a":"1","b":"2"} @property def start(self): return (self.current_page_num - 1) * self.per_page_num @property def end(self): return self.current_page_num * self.per_page_num def page_html(self): # 如果总页码 < 11个: if self.all_pager <= self.pager_count: pager_start = 1 pager_end = self.all_pager + 1 # 总页码 > 11 else: # 当前页如果<=页面上最多显示11/2个页码 if self.current_page_num <= self.pager_count_half: pager_start = 1 pager_end = self.pager_count + 1 # 当前页大于5 else: # 页码翻到最后 if (self.current_page_num + self.pager_count_half) > self.all_pager: pager_start = self.all_pager - self.pager_count + 1 pager_end = self.all_pager + 1 else: pager_start = self.current_page_num - self.pager_count_half pager_end = self.current_page_num + self.pager_count_half + 1 page_html_list = [] first_page = '<li><a href="?page=%s">首页</a></li>' % (1,) page_html_list.append(first_page) if self.current_page_num <= 1: prev_page = '<li class="disabled"><a href="#">上一页</a></li>' else: prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page_num - 1,) page_html_list.append(prev_page) #self.params=copy.deepcopy(request.GET) # {"a":"1","b":"2"} for i in range(pager_start, pager_end): self.params["page"]=i if i == self.current_page_num: temp = '<li class="active"><a href="?%s">%s</a></li>' %(self.params.urlencode(),i) else: temp = '<li><a href="?%s">%s</a></li>' % (self.params.urlencode(),i,) page_html_list.append(temp) if self.current_page_num >= self.all_pager: next_page = '<li class="disabled"><a href="#">下一页</a></li>' else: next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page_num + 1,) page_html_list.append(next_page) last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,) page_html_list.append(last_page) return ''.join(page_html_list)
第十一坑 拔插式用户授权rbac 这里面牵扯很多的耦合综合能力较强

浙公网安备 33010602011771号