Django 之奇技淫巧 Admin

本贴最后更新于 3120 天前,其中的信息可能已经水流花落

Django Admin Site

1. 自定后台管理面板列表显示的返回值

class ThesisTopicReviewHistoryAdmin(admin.ModelAdmin):
list_display = ('reviewer', 'thesisTopic', 'comment', 'state', )
list_filter = ('state', 'reviewer', 'created', )
search_fields = ('thesisTopic',)

def save_model(self, request, obj, form, change):
    # 保存该评审记录
    obj.save()
    # 改变相应题目的评审状态
    topic = obj.thesisTopic
    topic.reviewState = obj.state
    topic.save()

def get_readonly_fields(self, request, obj=None):
    if request.user.is_superuser:
        return ()
    else:
        return self.list_display
		

以上类如 get_attrbute_fields()的方法均可以重写。
如果需要让一个 timestamp 类型的 create_at 属性不是显示整数二十显示一个完整的日期,可以重写此方法.

class TeacherReviewAdmin(admin.ModelAdmin):
list_display = ('get_topic', 'student', 'comment', 'score','create_at','get_year', 'review_state',)
list_filter = ('student__year', 'student__studentClass', 'student__studentClass__campus')
search_fields = ('student__name', 'student__studentNo')
teacher_readonly_fields = ('student', 'topic', 'finalthesisdoc',)
teacher_readonly_fields_no_topic = ('student', 'topic', 'finalthesisdoc', 'comment', 'score', 'review_state',)
superuser_readonly_fields = ('topic', 'finalthesisdoc',)

superuser_fields = ('student', 'topic', 'finalthesisdoc', 'comment', 'score', 'review_state',)
teacher_fields = ('student', 'topic', 'finalthesisdoc', 'comment', 'score', 'review_state',)

def get_year(self, obj):
    return obj.student.year
# 甚至可以动态更改属性的描述
get_year.short_description = u'年份'
get_year.admin_order_field = '-student__year'
def create_at(self, obj=None):
    return datetime.datetime.fromtimestamp(obj.create_at)

2. 自定义列表字段 html 标签返回

class WeiboUserAdmin(admin.ModelAdmin):
def expires_time(self, obj):
    return datetime.datetime.fromtimestamp(obj.expires_at)
expires_time.short_description = u'授权过期时间'

def refresh(self,obj):
    btn_str = '<a class="btn btn-xs btn-danger" href="{}">{}</a>'
    return format_html(btn_str,'http://www.google.com',obj.uid)
refresh.short_description = u'更新授权'
# 注意要记得把这个方法放到现实列表里
list_display = ('nick','uid','access_token','expires_time','refresh')

1459653892756

这样你的表单上就会出现列按钮,同样的,你可以为此定义一个显示头像的方法

3. 下拉框列表过滤

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
    # 是超级管理员就全部跳过
    if request.user.is_superuser:
        pass
    # 不是超级管理员并且字段符合的话,就进行过滤
    elif db_field.name == 'official':
        kwargs['queryset'] = Official.objects.filter(user=request.user)
    return super(FilterAdmin, self).formfield_for_foreignkey(db_field, request=None, **kwargs)
	

下拉框过滤

1459746103458

竟然全部都是动态的字段,感觉很不安全啊

  • Django
    47 引用 • 72 回帖 • 4 关注
  • admin
    5 引用 • 9 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    541 引用 • 672 回帖 • 1 关注
  • 技淫巧
    3 引用 • 11 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...