个人博客,欢迎查看:https://blog.starmeow.cn/
Github地址:https://github.com/xyliurui/DjangoCRM
修改无自定义注册模型报错问题
现在访问没有自定义注册的model会报错,因为基类中没有写list_display
和list_filter
。
访问 http://127.0.0.1:8000/djadmin/crm/userprofile/

在基类中设置一个空列表就可以了
修改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_name
和 build_table_body
里面添加个判断

修改无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


修改无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 %}


网友评论