zoukankan      html  css  js  c++  java
  • 关于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,
        )
        # ...
    
  • 相关阅读:
    引用 struts2标签详解
    Java 中日期的计算
    在一个FORM中实现多个ACTION动作
    java.lang.OutOfMemoryError: PermGen space最好的解决方法
    Java实现和栈的应用举例
    Java的自动装箱和拆箱
    oracle11g更改字符集AL32UTF8为ZHS16GBK
    设计的臭味
    OOD设计五个原则
    推荐JQuery学习简介
  • 原文地址:https://www.cnblogs.com/zzhaolei/p/13162343.html
Copyright © 2011-2022 走看看