美文网首页Python Web开发学习
【CRM客户关系管理】10.处理无list_display和li

【CRM客户关系管理】10.处理无list_display和li

作者: 吾星喵 | 来源:发表于2018-11-27 18:37 被阅读0次

个人博客,欢迎查看:https://blog.starmeow.cn/

Github地址:https://github.com/xyliurui/DjangoCRM

修改无自定义注册模型报错问题

现在访问没有自定义注册的model会报错,因为基类中没有写list_displaylist_filter

访问 http://127.0.0.1:8000/djadmin/crm/userprofile/

image.png

在基类中设置一个空列表就可以了

修改djadmin注册基类

修改djadmin应用下的djadmin_base.py文件,增加一个父类,且为空列表的属性

# djadmin/djadmin_base.py


class BaseDjAdmin(object):
    list_display = []
    list_filter = []
    search_fields = []

现在访问 http://127.0.0.1:8000/djadmin/crm/userprofile/ 没有报错,但是没有显示出数据,需要在 build_table_head_namebuild_table_body 里面添加个判断

image.png

修改无list_display显示内容

由于注册类继承了BaseDjAdmin(object),默认list_display = [],如没有自定义注册模型的list_display,则进行判断,这时候表的标题就是model的别名;表的内容就显示model的返回值

修改模板标签的list_display判断

修改djadmin应用下的templatetags包中的djadmin_tags.py

使用admin_class.model._meta.verbose_namea获取模型的别名,dmin_class.model._meta.model_name可以获得模型的类名。

# 显示模型表的中文名称
@register.simple_tag
def build_table_head_name(admin_class):
    th = ''
    if admin_class.list_display:
        for display_field in admin_class.list_display:
            # 获取列中的字段对象
            display_field_obj = admin_class.model._meta.get_field(display_field)
            # print(display_field_obj.verbose_name)
            tmp = "<th>{}</th>".format(display_field_obj.verbose_name)
            th += tmp
    else:
        th += "<th>{}</th>".format(admin_class.model._meta.verbose_name)  # 如果没有自定义注册,则表格标题就显示模型的别名verbose_name
    return mark_safe(th)


# 显示表数据
@register.simple_tag
def build_table_body(obj, admin_class):
    """
    生成一条记录的html元素
    :param obj: 一个模型查询集中的一个对象
    :param admin_class: 自定义注册的类
    :return: 得到这个对象要求显示的所有列
    """
    td = ''
    if admin_class.list_display:
        for display_field in admin_class.list_display:
            # 获取列中的字段对象
            display_field_obj = admin_class.model._meta.get_field(display_field)
            # print(display_field_obj)
            # 字段对象choices方法,如果有choices,则使用get_xxx_display
            if display_field_obj.choices:
                # print('get_{}_display'.format(display_field))
                display_field_data = getattr(obj, 'get_{}_display'.format(display_field))()  # 使用get_xxx_display()需要带括号,调用函数执行结果,而不带括号得到的是函数对象
            else:
                # 根据属性名,获取对象的属性值,两个参数,一个对象obj,一个列名
                display_field_data = getattr(obj, display_field)  # 获取一个对象的属性值,例如<CustomerInfo: 小东>对象,得到他的name属性,值为小东
            tmp = "<td>{}</td>".format(display_field_data)
            td += tmp
    else:
        td += "<td>{}</td>".format(obj)  # 如果没有自定义注册字段,则显示对象的内容verbose_name
    return mark_safe(td)

访问 http://127.0.0.1:8000/djadmin/crm/userprofile/ 如果model没有verbose_name,则显示model的名字为表名,否则显示verbose_name

image.png image.png

修改无list_filter隐藏过滤

当没有自定义注册模型中的list_filter字段,默认为空,则前端页面不再显示过滤按钮

修改模板无list_filter隐藏过滤

修改table_detail.html当没有list_filter字段时,不显示

{% if admin_class.list_filter %}
    <p>
        <form class="navbar-form navbar-left">
            {% for filter_field in admin_class.list_filter %}
                {% build_option_filter filter_field admin_class %}
            {% endfor %}
            <button type="submit" class="btn btn-primary">过滤</button>
        </form>
    </p>
{% endif %}
image.png image.png

相关文章

网友评论

    本文标题:【CRM客户关系管理】10.处理无list_display和li

    本文链接:https://www.haomeiwen.com/subject/swdnqqtx.html