Django 的 Admin 模块还算是比较好用的吧,最起码不用完全自己造轮子了。但是这个东西也不能拿来就用。下面说说这几天遇到的坑。
change list 里面,那个 “删除选中” 的 action 如何去掉?
我定义了三个自己的 action,但是 action 列表里面总是有 “删除选中” 这个 action。明明没有在 actions
里面写啊!
Django 获取 action 列表的时候应该是通过 get_actions
函数来获取的。那么,重写一下这个函数就好了。如下。
class XXXAdmin(admin.ModelAdmin):
actions = [my_action_1, my_action_2, my_action_3]
def get_actions(self, request):
# Disable delete
actions = super(XXXAdmin, self).get_actions(request)
del actions['delete_selected']
return actions
我有一个 XXXModel ,想在首页上放一个到这个 Model 管理页面的直达链接?
对的,就是这个奇怪的需求。
首先情况说明几个东西:Django 的 Admin Site 分为好多种页面。直接用 admin.site.register
注册出来的这个大表格页面叫做 changelist
(好奇怪的名字啊),可以对 Model 进行修改的页面叫做 change
。
其次,为了到达这个大表格页面,我们需要知道两个东西:app_label
和 model_name
。
app_label
是 manage.py startapp XXXX
之后,apps.py
里面的 name
。一般会和前面你输入的 XXXX 是一致的。
model_name
么…… 比如你在 models.py 里面定义了一个 ABCModelLalala
,那么 model_name
就是 abcmodellalala
。
然后,在 Template 里面的使用方法为:{% url'admin:{{app_label}}_{{model_name}}_changelist'%}
比如,我的 application 叫做 HowOldAreYou
,有一个 Model 叫做 ModelAge
,那么,为了直达这个 Model 的管理大表格,我需要写的链接 URL 为 {% url'admin:HowOldWebsite_modelage_changelist'%}
。
我想自定义 Action
可以。直接看 doc 即可。
注意,queryset
可以直接当成 list 来用,也可以直接 queryset.update(xx=xxx)
这样一下子全部更新。
我想让在列表里面显示个图片出来
拿个函数包裹一下就好了。
class XXXAdmin(admin.ModelAdmin):
list_display = ('img_show', 'xxx', 'xxx', 'xxx')
actions = None
def img_show(self, obj):
s = u'<img src="{}face/{}.jpg"style="width:2em;height:2em">'
return format_html(s, django.conf.settings.MEDIA_URL, str(face.id))
感觉 Django 用尽了 Python 的黑魔法。
我知道类名,想获取这个类本身
恩,反射。
抓面这段代码很有用:
def reflect_get_class(class_full_name):
parts = class_full_name.split('.')
module = ".".join(parts[:-1])
m = __import__(module)
for comp in parts[1:]:
m = getattr(m, comp)
return m
=====
现就这么多。以后遇到坑再写。
第二次拿 Django 写东西,还是不熟练啊!
发表回复