关于Django Admin中inlines等类型的问题

关于Django Admin中inlines等类型的问题

工作中遇到一个问题,需要让一个表中的每一条记录不可修改,但是可以增加。发现使用readonly_fields字段可以让字段不可修改,但是新增的时候也不能新增了(需要填写的字段全部变成了空白,没有了输入框),在网上苦苦搜寻,终于找到了相关的问题,记录一下,防止以后再遇到此类问题。

关于两种Inline类

  • TabularInline: 这个主要是横向的以表格的形式展示/添加数据
  • StackedInline: 这个主要是纵向的形式展示/添加数据

解决方案

摘录了问题中的描述,添加一些文档:

class NoteListInline(admin.TabularInline):
    model = Note
    verbose_name = _('Note')
    verbose_name_plural = _('Notes')
    extra = 0
    can_delete = False  # 不允许删除
    # 定义展示的字段和顺序
    fields = (
        'note',
        'created_at'
    )
    # 只读的字段
    readonly_fields = (
        'note',
        'created_at'
    )

    def has_add_permission(self, request, obj=None):
        """
        不允许这个inline类增加记录
        (当然也增加不了,readonly_fileds中定义的字段,在增加时无法输入内容)
        """
        return False

class NoteAddInline(admin.StackedInline):
    model = Note
    verbose_name = _('Note')
    verbose_name_plural = _('Notes')
    extra = 1
    # 可以定义允许添加的字段
    # fields = ('note',)
    can_delete = False

    def get_queryset(self, request):
        """
        重写这个方法
        不显示任何的Note模型的记录,这个类就只允许添加相关的数据,不是用来展示数据的
        """
        queryset = super().get_queryset(request)
        return queryset.none()  # no existing records will appear

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    # ...
    # 在这里需要引入这两个类,一个用作展示,一个用作添加数据
    inlines = (
        NoteListInline,
        NoteAddInline,
    )
    # ...
posted @ 2020-06-19 12:05  zzhaoleiの博客  阅读(2875)  评论(0编辑  收藏  举报