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 %}
发布了51 篇原创文章 · 获赞 0 · 访问量 484

猜你喜欢

转载自blog.csdn.net/qq_40902339/article/details/103527744