admin常见问题

现在有两个表,一个是 主题 表,另一个是 视频 表,二者是多对多关系,现在我想在主题表新建一个记录时,把关联的视频数量也统计上,该怎么做?
  1. 在 主题 表中定义一个 视频数量 字段,用以存放统计数据。
  2. 在 admin.py 中 主题 表对应的ModelAdmin下重载 save_model 方法。 如下:
    1
    2
    3
    4
     def save_model(self, request, obj, form, change):
         obj.video_num = obj.theme_video.count() if change else len(dict(request.POST)['theme_video'])
    
         super().save_model(request, obj, form, change)
    

    官方文档 - ModelAdmin methods¶

提示:在第一次创建时,即 change 为 False,此时 obj.theme_video 会报错,因为此时 obj 对象还未创建(主要是主题表的主键还未生成,假如主键已创建的情况则忽略此提示),二者还未创建 多对多 关系。经过调试发现,关联的视频的 id 以 list 形式保存在 post 参数中,故读取 list 长度即可得知关联的视频数量。

现在有 一个 视频表,一个视频评论表。二者独立关系。现在想删除评论后同步减少视频表中评论统计数量。

对于 批量删除 记录并执行其他操作,此时表默认的批量删除已不满足需求,可以采用给表 自定义动作(action)的方式。添加 自定义动作,有两种方式,如下:

  1. 把 函数 写到类外部,然后 添加到 类的 actions属性中,注意: 此时 函数名 并没有加 引号。 ```python from django.contrib import admin from myapp.models import Article

def make_published(modeladmin, request, queryset): queryset.update(status=’p’) make_published.short_description = “Mark selected stories as published”

class ArticleAdmin(admin.ModelAdmin): list_display = [‘title’, ‘status’] ordering = [‘title’] actions = [make_published]

admin.site.register(Article, ArticleAdmin)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

2. 另一种就是下面写的形式了,建议以这种形式,因为这种形式可以添加动作执行的结果提示,而第一种不能。
 ```python
class VideoCommentAdmin(admin.ModelAdmin):
    list_display = ('uid', 'video_id', 'content', 'status')
    actions = ['delete_model_action']

    def delete_model_action(self, request, obj):
        for i in obj:
            Video.objects.filter(video_id=i.video_id).update(comment_num=F('comment_num') - 1)

        obj.delete()
        self.message_user(request, "已同步减少视频评论数量")

    delete_model_action.short_description = '同步删除'


admin.site.register(models.VideoComment, VideoCommentAdmin)

官方文档 - Admin actions

在 Admin 后台 编辑主表及内联表。并控制内联表的额外显示行数(默认多出3行)
1
2
3
4
5
6
7
8
9
10
11
12
13
class TwoLevelCategoryInline(admin.TabularInline):
    model = TwoLevelCategory
    exclude = ('two_level_id',)

    def get_extra(self, request, obj=None, **kwargs):
        extra = 1
        return extra


class OneLevelCategoryAdmin(admin.ModelAdmin):
    list_display = ('name', 'index')
    inlines = [TwoLevelCategoryInline, ]
    exclude = ('one_level_id',)

代码中 OneLevelCategory 为主表,TwoLevelCategory 为内联表。若在 admin 后台编辑,内联表 需定义在主表前。


在Admin中集成富文本编辑器

KindEditor富文本编辑器

在Admin 中直接上传文件到七牛云

Django Admin中使用七牛上传文件