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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM