CRM手记-2 | Django

#################################### kingadmin ######################################

# 需要做到的效果:点击客户库,出现所有客户信息,以及增删改查|多条件过滤|搜索|排序等功能;
# 后台添加相应数量的客户;
# 给admin中客户信息显示样式做自定制,包括过滤等;
# admin.py
    class CustomerAdmin(admin.ModelAdmin):
        list_display = [‘name‘,‘source‘,‘contact_type‘,‘contact‘,‘consultant‘,‘consult_content‘,‘status‘,‘date‘]
        list_filter = [‘source‘,‘consultant‘,‘status‘,‘date‘]
        search_filed = [‘contact‘,‘consultant__name‘]
        # 这个consultant是外键,搜索其字段需要双下划线‘__name‘;
    # 注册
    admin.site.register(models.CustomerInfo,CustomerAdmin)
# 显示样式大概如下:

# 因为我们做的是插拔式kingadmin,所以创建独立的app
    python3 manage.py startapp kingadmin
    ‘kingadmin‘
# 需要独立的static以及template
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, ‘statics‘),
        os.path.join(BASE_DIR, ‘kingadmin/statics‘),
    ]
    TEMPLATES = [
        ...
        ‘DIRS‘:[
            os.path.join(BASE_DIR, ‘templates‘),
            os.path.join(BASE_DIR, ‘kingadmin/templates‘)
        ],
        ...
    ]
    # 将crm应用中静态文件以及主模板都拷贝到kingadmin中;
# 写kingadmin的视图以及urlconf
    # urls.py
        ...
        url(r‘^kingadmin/‘, include(‘kingadmin.urls‘))
    # kingadmin中也创建一个urls.py
        ...
        url(r‘^login/‘, views.user_login),
        url(r‘^logout/‘, views.user_logout, name=‘logout‘),
    # 写一个独立的用户登录注销,将项目中的拷贝过来做一些修改
        from django.shortcuts import render,redirect
        from django.contrib.auth import authenticate,login,logout

        def user_login(request):
            error_message = ‘‘
            if request.method == ‘POST‘:
                username = request.POST.get(‘username‘)
                password = request.POST.get(‘password‘)
                user = authenticate(username=username,password=password)
                if user:
                    login(request,user)
                    return redirect(request.GET.get(‘next‘,‘/kingadmin/‘))
                else:
                    error_message = "worng username or password"
            return render(request, ‘/kingadmin/login.html‘,{‘error_message‘:error_message})

        def user_logout(request):
            logout(request)
            return redirect(‘/login/‘)
    # 出现了一个问题,访问的还是项目中的login页面;
    # 因为配置中的template配置是从上往下找的,从第一个找到login页面就显示了;
    # 修改kingadmin/login.html中的标题为kingadmin
    # 措施:在templates中新建一个文件夹存放html页面,并修改login访问路径;
    #         登录成功之后跳转kingadmin下的首页;
    # 在kingadmin中创建首页;
        # urls.py
            ...
            url(r‘^$‘,views.app_index,name=‘app_index‘)
        # views.py
            def app_index(request):
                return render(request, ‘/kingadmin/app_index.html‘)
        # app_index.html
            {% extends ‘kingadmin/index.html‘ %}
            {% block right_content %}
                The content for urself!
            {% endblock right_content %}
        # index.html
            # block在dashboard位置;
            {% block right_content %}
            {% endblock right_content %}

# 将已经注册的app显示到页面中;怎么判断有没有注册?
    # 拿到settings.py中的INSTALLED_APPS,先页面中显示;
    # views.py
        from PerfectCRM import settings

        def app_index(request):
            print(settings.INSTALLED_APPS)
            return render(request, ‘/kingadmin/app_index.html‘)
    # 问题:如果将kingadmin搬到别的项目中呢?PerfectCRM就读取不到;
    # 措施:动态导入;django.conf.settings动态获取项目settings配置
    # views.py
        from PerfectCRM import settings
        from django import conf

        def app_index(request):
            print(conf.settings.INSTALLED_APPS)
            return render(request, ‘/kingadmin/app_index.html‘)

# 模仿admin.py中自定制显示的操作;
# 在crm应用中添加kingadmin.py;完成注册,自定制显示等操作;
# 首先,需要让django能够访问到这个文件,拿到里面的配置:
# 方法:在视图中,根据conf.settings中的字符串‘crm‘,
#         找到这个应用下的kingadmin文件,执行里面的代码;
# 知识点:反射;
    from django import conf

    def app_index(request):
        for app_name in conf.settings.INSTALLED_APPS:
            try:
                _module = __import__(‘%s.kingadmin‘%app_name)
                print(_module.kingadmin)
            except ImportError:
                pass
        return render(request, ‘kingadmin/app_index.html‘)
    # 这样就找到了kingadmin.py
# 怎么显示app下的表?
# 怎么让django识别admin类下的展示的一些配置?绑定表跟类;
    enabled_admins = {
        # 应用名:{‘表名‘:‘admin类‘, ...}
        ‘crm‘:{‘customer‘: CustomerAdmin, ‘role‘: RoleAdmin}
    }
    # 怎么生成这样的字典?
# kingadmin.py中大致模样:
    class CustomerAdmin(object):
        list_display = [‘name‘,‘source‘,...]
        list_filter = [‘source‘,‘consultant‘, ...]
        search_field = [‘contact‘, ...]
    admin.site.register(models.Customer,CustomerAdmin)
    # 并且在所有app中都支持这个注册功能
    # 再建一个student的应用,并注册,写一个测试model
    # models.py
        class Test(models.Model):
            name = models.CharField(max_length=32)
    # 再建一个kingadmin.py
        class TestAdmin(object):
            list_display=[‘name‘]
        admin.site.register(models.Test,TestAdmin)

# 读取每个app中的kingadmin,最终生成上面的全局字典;
# 在kingadmin下新建sites.py
    # sites.py
        class AdminSite(object):
            def __init__(self):
                self.enabled_admins = {}

            def register(self,model_class,admin_class=None):
                """注册admin表"""
                print(model_class,admin_class)

    site = AdminSite()
    # kingadmin.py
        from crm import models
        from kingadmin.sites import site

        class CustomerAdmin(object):
            pass
        site.register(models.Customer,CustomerAdmin)
# 问题:执行kingadmin.py的操作应该是程序一启动就执行,
#         所以,不应该放在app_index()视图中;
# 措施:新建app_setup.py将这些操作写入函数放置在这个文件中;
    # app_setup.py
        from django import conf
        def kingadmin_auto_discover():
            for app_name in conf.settings.INSTALLED_APPS:
                try:
                    _module = __import__(‘%s.kingadmin‘%app_name)
                    print(_module.kingadmin)
                except ImportError:
                    pass
    # views.py
        from kingadmin import app_setup

        app_setup.kingadmin_auto_discover()
        ...

# 怎么通过表名拿到app的名字?
# 使用python3 manage.py shell 来做一些模块属性方法的查找
# 因为ipython3中无法进入django数据库环境;
    >> from crm import models
    >> models.CustomerInfo  # 怎么通过表名拿到app的名字?
    >> models.CustomerInfo._meta
    <Options for CustomerInfo>
    >> dir(models.CustomerInfo._meta)
    # 将内容复制到txt中,搜app_label
    >> models.CustomerInfo._meta.app_label
    ‘crm‘  # 就拿到了应用名

# 构建全局字典时,嵌入应用名时需要判断是否存在;
    # sites.py
        class AdminSite(object):
            def __init__(self):
                self.enabled_admins = {}

            def register(self,model_class,admin_class=None):
                """注册admin表"""
                print(model_class,admin_class)
                app_name = model_class._meta.app_label
                model_name = model_class._meta.model_name
                # 全局字典中不存在这个应用名,就添加;
                if app_name not in self.enabled_admins:
                    self.enabled_admins[app_name] = {}
                # 表名怎么获取?
                # >> models.CustomerInfo._meta.model_name
                self.enabled_admin[app_name][model_name] = admin_class
    # 只实例化一次
    site = AdminSite()

# 这样就构造一个类似下面的字典
    enabled_admins = {
        # 应用名:{‘表名‘:‘admin类‘, ...}
        ‘crm‘:{‘customer‘: CustomerAdmin, ‘role‘: RoleAdmin}
    }
# 将字典数据返回前端,返回site就可以了;
    # views.py
        def app_index(request):
            return render(request, ‘kingadmin/app_index.html‘, {‘site‘:site})
    # app_index.html
        {% for app_name,app_tables in site.enabled_admins.items %}
            {{ app_name }}{{ app_tables }}
        {% endfor %}
    >> crm{‘customerinfo‘:<class...>} student{‘test‘:<class...>}
    # 只要将这些对象输出到表格中;在bootstrap中找表格示例;
        {% for app_name,app_tables  in site.enabled_admins.items %}
            <table class="table table-striped">
                <thead>
                    <tr>
                        <th>{{ app_name }}</th>
                    </tr>
                </thead>
                <tbody>
                    {% for model_name in app_tables %}
                        <tr>
                            <td><a  href="{% url ‘table_obj_list‘ app_name model_name %}">{{ model_name }}</a></td>
                            <td>ADD</td>
                            <td>Change</td>
                        </tr>
                    {% endfor %}
                </tbody>

            </table>

# crm中多注册几个表
site.register(models.Role)
site.register(models.Menus)
site.register(models.UserProfile)

################################ 以上是注册模型类到kingadmin的功能

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

时间: 2024-10-09 07:10:00

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

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手记-5 | Django

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

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__" #字