• day23_雷神_crm-day2


    俺滴第一个项目 CRM


    MdelForm 实现增删改查

    1. ModelForm,重写 __init__ 方法,给所有字段添加 form-control 样式。 
    2. ModelForm,报错错误信息,在settings中 zh-hans 
    3. ModelForm,对象可以在模板中被循环。 change.html 
    4. ModelForm,自定义字段 + 钩子函数 
    

    权限部分

    5. 表结构设计: 基于用户和基于角色的权限控制,请问为什么要引入角色表?
    6. 权限系统中有几张表?5张
    7. 权限实现流程图 
    	- 白名单
    		- 正则、中间件
    	- 权限初始化 
    		- ORM 
    		- left join空值
    		- 去重 
    		- 放入session 
    	- 权限校验 
    		- 正则、中间件 
    	- 动态生成菜单
    		- inclusion_tag  
    	- 粒度控制按钮 
    		- filter  
    

    github

    链接

    https://github.com/houbinglei/crm_project2.git
    

    项目步骤

    • templates目录,先找项目下的目录,然后再按照注册app顺序依次寻找

    • static也是同样

      STATICFILES_DIRS = [
      os.path.join(BASE_DIR, "static"),
      ]
      这个是在添加basedir下的static目录才用写。

    • userlist的页面:先展示的list页面,objects.all()就可以了。

    • 添加需要modelform生成,先写modelform类,forms文件夹,写user.py,里面写类。

    • 循环form对象,相当于form.数据库的字段了。 input标签直接用{{ field }}就生成额。

    • ModelForm,重写 init 方法,self.fields.items(),k是字段名字,v是对象,可以v.widget.attrs['class'] = 'form-control',批量添加属性。

    • 继承父类:super().init(varieties, sex, color,),super里或者不写,写的话是写自己,从自己往上找

    • ModelForm,报错错误信息,修改LANGUAGE_CODE = 'zh-hans'

    • 增删改查。逐一实现。删除添加是否确定按钮

    • ModelForm,自定义字段 + 钩子函数,钩子函数需要返回值,是该字段的值,要不然在clean_data里该字段值为空

    • 新建一个rbac的app,开始搞权限。

    • 写login函数。

    • rbac,中间件白名单---视图函数login验证---通过做权限初始化---返回跳转页---还是中间件,通过session做权限判断---是否有权限访问

    • html模板中读不到配置文件,request.session.x1 这个x1改成配置文件,它读不到

    • 模板中可以定义函数,

      1. 在已注册的app中创建一个templatetags的目录
      2. 在目录中任意创建一个文件rbac.py
      3. from django.template import Library
      4. register = Library()

    代码

    import re
    from django.template import Library
    from django.conf import settings
    
    register = Library()
    
    {% load rbac %}  # 加载进来rbac.py里的所有函数
    # 用于在为模板自定义函数,调用方式: {% func 1 2 3 4 %}
    @register.simple_tag
    def func(a1,a2,a3,a4):
        return a1 + "666"
    
    # 用于在为模板自定义函数,调用方式: {{ '田建宇'|foo:"dsb" }} + 可以在 if后面做条件
    @register.filter
    def foo(a1,a2):
        return '999'
    
    # 用于返回一个代码块
    @register.inclusion_tag('rbac/menu.html')
    def get_menu(request):  # request通过页面调用的地方传递进来    {% get_menu request %}
        menu_list = request.session.get(settings.RBAC_SESSION_MENU_KEY)
        """
        [
            {
                'title':'x1',
                'url':'/xxx/',
                'name':x1,
            },
            {
                'title':'x1',
                'url':'/xxx/',
                'name':x1,
                'class':'active'
            }
        ]
        """
        for item in menu_list:
            url = '^%s$' % item['url']
            if re.match(url,request.path_info):
                item['class'] = 'active'
        return {
            'menu_list': menu_list
        }
    
    @register.filter
    def has_permission(request,name):
        """
        判断用户是否有该name权限
        :param request:
        :param name:
        :return:
        """
        permission_dict = request.session.get(settings.RBAC_SESSION_PERMISSION_KEY)
        if name in permission_dict:
            return True
    

    控制到颗粒按钮

    {% extends 'layout.html' %}
    {% load rbac %}
    {% block content %}
    
        {% if request|has_permission:'depart_add'%}
        <div style="margin: 5px;">
            <a href="/crm/depart/add/" class="btn btn-primary"><i class="fa fa-plus-circle" aria-hidden="true"></i> 添加</a>
        </div>
        {% endif %}
    
        <table class="table table-bordered">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>名称</th>
                    {% if request|has_permission:'depart_edit' or  request|has_permission:'depart_del'%}
                    <th>操作</th>
                    {% endif %}
                </tr>
            </thead>
            <tbody>
                {% for row in depart_queryset %}
                    <tr>
                        <td>{{ row.id }}</td>
                        <td>{{ row.title }}</td>
                        {% if request|has_permission:'depart_edit' or  request|has_permission:'depart_del'%}
                        <td>
                            {% if request|has_permission:'depart_edit' %}
                                <a href="/crm/depart/edit/{{ row.id }}/"><i class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
                            {% endif %}
                            {% if request|has_permission:'depart_del' %}
                                <a href="/crm/depart/del/{{ row.id }}/" style="color: red;"><i class="fa fa-trash-o" aria-hidden="true"></i></a>
                            {% endif %}
                        </td>
                        {% endif %}
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    
        <nav aria-label="Page navigation">
          <ul class="pagination">
              {{ pager.page_html|safe }}
          </ul>
    </nav>
    {% endblock %}
    My name is 侯冰雷 ~~欢迎转载 ~~欢迎关注 ~~欢迎留言
  • 相关阅读:
    ASP.Net验证码类
    net进行Socket通信
    web browser 小结
    WebService远程调试
    javascript 资料(一)
    释放非托管资源 IDisposable模式的实现、使用
    asp.net2.0 WebForm_DoPostBackWithOptions
    使用jquery.json把js对象转换成json
    多选列表双击选中
    JQuery对Select的操作
  • 原文地址:https://www.cnblogs.com/houbinglei/p/9984127.html
Copyright © 2020-2023  润新知