Django admin:隐藏新记录的只读字段?

时间:2011-02-23 13:55:43

标签: django django-admin

我正在使用Django管理站点,其中包含记录上的一些只读字段:

class BookAdmin(admin.ModelAdmin):
    fieldsets = [
    (None, {'fields': ['title', 'library_id', 'is_missing', \
                       'transactions_all_time']}),
    ]
    readonly_fields = ['transactions_all_time',]
    list_display = ('library_id', 'author', 'title')

编辑记录时效果很好 - transactions_all_time字段是只读的,就像我想要的那样。

但是,添加新记录时,它的行为有点奇怪。我在页面底部看到一个只读部分,我无法编辑,此时此部分无关紧要。

如果在添加新记录时根本不存在该字段会好得多。

是否有任何Django选项在添加新记录时不显示只读字段?我知道我可以在add_form.html上破解它来隐藏它,但是有更好的方法吗?

感谢。

4 个答案:

答案 0 :(得分:13)

我有类似的问题。像这样解决了

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields = ('field_one',)
    def get_readonly_fields(self, request, obj=None):
        if obj: # Editing
            return self.readonly_fields
        return ()

答案 1 :(得分:3)

这是Kushal解决方案的DRY版本:

def get_fieldsets(self, request, obj=None):
    def if_editing(*args):
        return args if obj else ()
    return (
        (None, {
            'classes': ('wide',),
            'fields': if_editing('admin_thumb', 'admin_image',) +
                      ('original_image', 'user', 'supplier', 'customer', 'priority',)}
        ),
    )  

请注意,这仅适用于主窗体 - 在内联窗体中,您传递的是主要的obj,而不是内联对象。

答案 2 :(得分:1)

我遇到了类似问题,但解决方案略有不同。我想隐藏“新”表单(“添加”视图)中的图像预览(只读字段),但在获取新对象时显示它们:

class PhotoAdmin(admin.ModelAdmin):
readonly_fields = ('admin_image', 'admin_thumb', )
search_fields = ('filename', 'user', 'supplier', 'customer')
list_display= ('admin_thumb','filename', 'user', 'supplier', 'customer')
#fields = ('admin_thumb', 'admin_image', 'original_image', 'user', 'supplier', 'customer')


def get_fieldsets(self, request, obj=None):
    fieldset_existing = (
        (None, {
            'classes': ('wide',),
            'fields': ('admin_thumb', 'admin_image',
                'original_image', 'user', 'supplier', 'customer', 'priority',)}
        ),
    )
    fieldset_new = (
        (None, {
            'classes': ('wide',),
            'fields': ('original_image', 'user', 'supplier', 'customer', 'priority',)}
        ),
    )
    if obj: # Editing
        return fieldset_existing
    return fieldset_new

#fields行显示原始字段。我承认这个解决方案不是很“干”,但它清晰简单。

答案 3 :(得分:0)

另一种方法是在原始模型中设置editable arg。

class Book(models.Model):
    transactions_all_time = models.BooleanField(editable=False)

您的ModelAdmin不会在版本中显示该字段,该字段将被排除。