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")
views中登陆ajax和认证组件代码

 

# 验证码
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)
View 验证码带噪点噪线
<!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>
前端页面带验证码ajax

   第一种 登陆中的坑一般在中间件的设置上一个问题就是有些页面是要用户登陆了之后才能看的但是前面的设置中我们没有考虑这一点,处理有两种办法,第一种是加中间件这里面的坑就是设置白名单,如果把有些应该放出来的都给拦住了,那么就连登陆都进不去了中间件的相关知识可以参考  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})
基于modeform实现注册
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'})
form组件中的代码

验证错误尽量用钩子去验证前端也可以做验证但是不安全

 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)
用户类的get与post 逻辑大致相似所以写在一起
####################添加和编辑用户放一起#####################
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  这里面牵扯很多的耦合综合能力较强

 

posted @ 2018-11-08 19:45  RootEvils  阅读(201)  评论(0)    收藏  举报