zoukankan      html  css  js  c++  java
  • djangCrm

    ---恢复内容开始---

    一>

    在数据库进行循环取多对多

    def get_classlist(self):
    l=[]
    for cls in self.class_list.all():
    l.append(str(cls))
    return mark_safe(",".join(l))


    <td>{{ customer.get_classlist }}</td>


    二>

    可以通过admin进入控制台进行录入数据库
    1 from django.contrib import admin
    2 
    3 # Register your models here.
    4 from  app01.models import *
    5 admin.site.register(UserInfo)
    6 admin.site.register(ClassList)
    7 admin.site.register(Customer)
    8 admin.site.register(Campuses)
    View Code

    在urls 引入 

    from django.contrib import admin

    三>
    进行数据录入


    四>
    更改auth,向其添加字段
    from django.contrib.auth.models import AbstractUser
    class UserInfo(AbstractUser):
    tel=models.CharField(max_length=32,null=True,blank=True)
    gender=models.IntegerField(choices=((1,"男"),(2,"女")),default=1)


    五>别名
    两个路径一个页面,通过reverse 判断
    from django.urls import reverse

    这里返回的是过略后的数据库
    def customers(request):
    if reverse("customers_list")==request.path:

    customers_list = Customer.objects.all()
    else:
    customers_list = Customer.objects.filter(consultant=request.user)


    两个别名
    path("customers/",views.customers,name="customers_list"),
    path("mycustomers/",views.customers,name="mycustomers"),
    六>关于过略
    from django.db.models import Q
    单个过略
    val=request.GET,get("q")
    filter=request.GRT.get("filter")
    if val:
    q=Q()
    q.children.append((filter,val),) #y由于不可以将变量传到搜索的数据库,所以引用Q,通过q.children.append将两个变量赋值,后面可以继续
    添加数据,默认且的关系
    customers_list=customers_list.filter(q)

    djangoCrm2

    1.模糊查询

    由于Q的可以传递字符串属性,可以进行拼接__contains 进行搜索

    2.未报名筛选,未报名的存储在models的 enroll_status_choices中,存储的是

    enroll_status_choices = (('signed', "已报名"),
    ('unregistered', "未报名"),
    ('studying', '学习中'),
    ('paid_in_full', "学费已交齐"))

    需要找到元祖对应的字段,在前段用get__signed__display显示

    方法,找到select选择的属性,点击属性的时候讲原有的optiopn 替换成那4个状态,进行change的查询
    $("#s1").change(function () {
            if ($(this).val() === "status") {
                let s1 = `
                   <select name="q" id="s2">
                        <option value="signed">已报名</option>
                        <option value="unregistered">未报名</option>
                        <option value="studying">学习中</option>
                        <option value="paid_in_full">学费已交齐</option>
                    </select>
                `;
                $(this).next().replaceWith(s1)
            }
        })
    
    未报名筛选
    View Code

    3.批量处理

    进行批量处理时,需要将文件与checkbox 写入一个form表单,在循环的文件加入checkbox循环

    运用获取批量处理的value 执行面向对象的反射

    <td><input type="checkbox" name="select_pk_list" value="{{ customer.pk }}"></td>
    def post(self,request):
            #批量处理
            print(request.POST)
            func_str=request.POST.get("action")
            data=request.POST.getlist("select_pk_list")
            if not hasattr(self,func_str):
                return  HttpResponse("非法输入")
            else:
                func=getattr(self,func_str)
                queryset=Customer.objects.filter(pk__in=data)
                func(request,queryset)
                return redirect(request.path)
        def patch_delete(self,request,queryset):
            queryset.update(sex="male")
    
    批量处理
    View Code

    4.添加客户

    通过forms.ModelForm 进行 MODELFORM操作,  引入form  定义form表单

    class CustomerModelForm(forms.ModelForm):

    class=MATE  fields=__all__""  model=Customer

    通过传递form

    form=CustomerModelForm(request.POst)

    在页面上循环取出

    成功返回添加页面

    失败返回添加页面

    5<>

    编辑

    唯一于添加不同的是

    urls 通过re_path进行捕获到主键

    edit_obj=request.POST.get(px=id)

    form=CustomerModelForm(request.POst,instance=edit.obj)

    来区分

    这里若是要返回上一级,则需要额外她在在页面添加一个他要返回的上一级地址,

    因为他只向的是edit1这个标准路由,要去到上一级需要拼接并且存储在返回的编辑标签上

    然后利用redirect重定向 方法为

    path=request.path

    next="?next=%s",%spath

    6>

    公户转私户

    用反射将

    consultant=request.user
    即可


      


    7>
    未报名颜色

    def get_status(self):
    status_color={
    "studying":"green",
    "signed":"#B03060",
    "unregistered":"red",
    "paid_in_full":"blue"
    }
    return mark_safe("<span style='color:white'>%s</span>"%(status_color[self.status],self.get_status_display()))

    在前端传递的是对象,有自己的方法,,可以再models 生成一个方法,让这个方法被调用,返回值就是这个方法的结果





  • 相关阅读:
    五、敏捷开发框架 初识组件式开发
    winform 控制Text Box只能输入英文数字和退格键
    WPF 常用控件属性
    问题分析
    串口通讯学习
    解决MVC中Model上的特性在EF框架刷新时清空的问题
    论序列化与反序列化
    dynamics 365 安全角色及权限
    .NET Core 依赖注入框架 框图笔记
    C#基本类型的取值范围与 .NET框架类型的对应
  • 原文地址:https://www.cnblogs.com/qq849784670/p/9955047.html
Copyright © 2011-2022 走看看