CRM手记-5 | Django

# 过滤补充;
# 点击userprofile表报错;
# 因为当没有自定义admin_class时,默认使用的是BaseKingAdmin;
# 所以,BaseKingAdmin需要做一些默认的配置;
    # admin_base.py
        class BaseKingAdmin(object):
            list_display = []
            list_filter = []
            search_fields = []
    # 此时列表为空,build_table_row()的将没有返回值,前端显示空;
    # 做一个判断:
    # kingadmin_tag.py
        def build_table_row(obj,admin_class):
            """生成一条记录的html element"""

            ele = ""
            if admin_class.list_display:
                for column_name in admin_class.list_display:

                    column_obj = admin_class.model._meta.get_field(column_name)
                    if column_obj.choices: #get_xxx_display
                        column_data = getattr(obj,‘get_%s_display‘% column_name)()
                    else:
                        column_data = getattr(obj,column_name)

                    td_ele = "<td>%s</td>"% column_data
                    ele += td_ele
            else:
                td_ele = "<td>%s</td>" % obj
                ele += td_ele
            return mark_safe(ele)

    # 问题:没有注册admin_class,但是还是显示过滤;
        # table_obj_list.html
            <div>
                <!-- 判断是否有list_filter -->
                {% if admin_class.list_filter %}
                    <form action="">
                        {% for filter_column in admin_class.list_filter %}
                            {% build_filter_ele filter_column admin_class %}
                        {% endfor %}
                        <input type="submit" value="过滤">
                    </form>
                {% endif %}
            </div>
    # django-admin中如果没有注册不显示字段,表头显示表名;
        # table_obj_list.html
            <tr>
            {% if admin_class.list_display %}
                {% for column in admin_class.list_display %}
                    <th>{{ column }}</th>
                {% endfor %}
                {% else %}
                <th>{{ admin_class.model._meta.model_name }}</th>
            {% endif %}
            </tr>
    # 报错,因为模板语言不允许前缀下划线_meta
    # 写一个simple_tag
        # kingadmin_tag.py
            @register.simple_tag
            def get_model_name(admin_class):
                return admin_class.model._meta.model_name.upper()
        # table_obj_list.html
            <th>{{ get_model_name admin_class }}</th>

##############################################################
# 分页功能开发;
# 处理一:django-pure-pagination
    # veiws.py
        @login_required
        def table_obj_list(request,app_name,model_name):
            ...
            # 分页
            try:
                page = request.GET.get(‘page‘, 1)
            # 出现异常也取第一页
            except PageNotAnInteger:
                page = 1
            # 实例化分页器类,5条数据一页
            p = Paginator(querysets, 2, request=request)
            # 通过Paginator内部的page()方法,获取Page分页对象
            # 传入当前页码(指定页面)
            current_page = p.page(page)

            return render(request,‘kingadmin/table_obj_list.html‘, {
                ‘querysets‘:querysets,
                ‘admin_class‘:admin_class,
                ‘current_page‘:current_page
            })
    # table_obj_list.html
        <nav aria-label="Page navigation">
            <!-- 分页-->
            <ul class="pagination">
                <!-- 上一页 -->
                <!-- 如果有前一页就显示,没有就不显示,或者其他操作-->
                {% if current_page.has_previous %}
                    <li class="long"><a href="?{{ current_page.previous_page_number.querystring}}">上一页</a></li>
                {% else %}
                {% endif %}

                <!-- 遍历显示所有页码 -->
                {% for page in current_page.pages %}
                    <!-- 如果页码存在,就执行 -->
                    {% if page %}
                        <!-- 如果遍历到的页码是当前页,就激活样式 -->
                        {% ifequal page current_page.number%}
                            <li class="active"><a href="?{{ page.querystring }}">{{ page }}</a></li>
                        {% else %}
                            <li><a href="?{{ page.querystring }}">{{ page }}</a></li>
                        {% endifequal %}
                    {% else %}
                        <li class="none"><a href="">...</a></li>
                    {% endif %}
                {% endfor%}
                <!-- 下一页 -->
                {% if current_page.has_next %}
                    <li class="long"><a href="?{{ current_page.next_page_number.querystring}}">下一页</a></li>
                {% else %}
                {% endif %}
            </ul>
        </nav>
# 问题:分页之后再点击过滤,分页不作为条件;
#       过滤之后分页,在原url基础之上添加?page=,将过滤后的数据传递给分页;
    # views.py
        def get_filter_result(request,querysets):
            filter_conditions = {}
            for key,val in request.GET.items():
                # 排除分页的影响
                if key != ‘page‘:
                    if val:
                        filter_conditions[key] =  val
                else:
                    pass
            return querysets.filter(**filter_conditions),filter_conditions

###################################################################

原文地址:https://www.cnblogs.com/pymkl/p/8309807.html

时间: 2024-10-13 00:35:21

CRM手记-5 | Django的相关文章

CRM手记-2 | Django

#################################### kingadmin ###################################### # 需要做到的效果:点击客户库,出现所有客户信息,以及增删改查|多条件过滤|搜索|排序等功能: # 后台添加相应数量的客户: # 给admin中客户信息显示样式做自定制,包括过滤等: # admin.py class CustomerAdmin(admin.ModelAdmin): list_display = ['name'

CRM手记-8 | Django

# 搜索|在已经过滤的条件之下做搜索; # 在查询语句中,用"包含"来做模糊搜索: # model_class.objects.filter(contact__contains='33') # 涉及到Q的操作;这里通过Q这个类来实现; # table_obj_list.html <form> <input type="search" name="_q"> <input type="submit"

CRM手记- 12 | Django

# 4.删除 # 在修改记录页面左下角添加一个删除按钮,一个链接,跳转至一个提示删除内容的页面,确认删除: # 关联删除,删除记录同时也删除外键的关联表; # table_obj_common.html <div class="form-group"> <div class="col-sm-10"> <a href="{% table_obj_delete app_name model_name form_obj.instan

CRM手记-6 | Django

# 排序功能开发: # 单条件排序; # 在表头每个字段上都添加a标签,点击降序,记住这次操作,再次点击反序(用箭头图标展示); # table_obj_list.html <th><a href="?_o=">{{ column }}</a></th> # _0等于字段的索引,如果为负,反序; # 所以可以通过模板标签forloop.count0来取; <th><a href="?_o={{forloop.c

django--项目创建

一.django 框架初探 (心蓝1202) 1 web框架介绍 wsgi web service gate interface web框架就是讲web应用开发中通用的部门抽象出来,形成一个框架,再去实现我们特定的功能 django 全能型 tornado 优秀的异步框架 web.py 小区的web框架 flask 优秀的轻量级的web框架 设计模式:mtv m models moxing t template 模板 v view 视图 2.django框架的介绍 1.环境搭建,django的安

Django之路 - 项目实战之&lt;教育行业CRM开发&gt;

本节内容 业务痛点分析 项目需求讨论 使用场景分析 表结构设计 业务痛点分析 我2013年刚加入老男孩教育的时候,学校就一间教室,2个招生老师,招了学生后,招生老师就在自己的excel表里记录一下,每月算工资时,就按这个表来统计招生提成, 后来学校大了点,教室变成了3间,招生老师变成了4个人,招的学生也开始多了起来,不过大家依然是招了学生就纪录在自己的excel里,但问题开始出现了,我们的招生多是通过网络qq聊天在线咨询,好多客户需要聊很久才能转化成学员,经常会出现一个客户跟一个招生老师聊过后,

Django CRM学员系统项目

项目需求: 1.分讲师\学员\课程顾问角色,2.学员可以属于多个班级,学员成绩按课程分别统计3.每个班级至少包含一个或多个讲师4.一个学员要有状态转化的过程 ,比如未报名前,报名后,毕业老学员5.客户要有咨询纪录, 后续的定期跟踪纪录也要保存6.每个学员的所有上课出勤情况\学习成绩都要保存7.学校可以有分校区,默认每个校区的员工只能查看和管理自己校区的学员8.客户咨询要区分来源 开发一个项目 首选就是先设计好表结构 表结构设计完成 后面写代码就比较轻松了 我这边创建的项目是crm 项目名为app

Django CRM客户关系管理系统

CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现在企业与客户之间的业务和企业内部之前部门之间的业务.因此CRM客户关系管理系统不但可以记录企业自内部信息,对于客户信息存储也是可以做到的,其中还涉及市场竞争对手的情报资料,还包括了企业进行营销.销售及支持服务所需的各种数据. 功能实现 (1)建议统一的信息编码系统; (2)设计能够良好反映事物特性的

Django项目:CRM(客户关系管理系统)--40--32PerfectCRM实现King_admin添加不进行限制

1 # forms.py 2 # --------19PerfectCRM实现King_admin数据修改-------- 3 from django import forms 4 from crm import models 5 6 # class CustomerModelForm(forms.ModelForm): 7 # class Meta: #调用内置方法 8 # model = models.Customer #获取表名 9 # fields = "__all__" #字