關於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,
)
# ...