关于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,
)
# ...