Django admin:如何在模型中显示标记为editable = False'的字段?

时间:2010-10-19 11:00:46

标签: django django-admin

即使某个字段在模型中标记为'editable=False',我也希望管理页面能够显示它。目前它完全隐藏了这个领域..如何实现这一目标?

5 个答案:

答案 0 :(得分:170)

使用Readonly Fields。像这样(对于django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)

答案 1 :(得分:16)

<强>更新

如果您希望在Admin中保持字段可编辑但在其他任何位置不可编辑,则此解决方案非常有用。如果你想让整个中的字段不可编辑,那么@Till Backhaus'answer是更好的选择。

原始答案

执行此操作的一种方法是在管理员中使用自定义ModelForm。此表单可以覆盖必填字段以使其可编辑。因此,除了管理员之外,您还可以在其他任对于例如(用Django 1.2.3测试)

editable=False

答案 2 :(得分:0)

您的只读字段也必须位于以下字段中:

tell application "System Events" to return ¬
    the value of attribute "AXIndex" of ¬
        (rows of table "Track List" of ¬
            (windows of application process "Pro Tools" whose name contains "Mix:") ¬
                whose value of attribute "AXSelected" is true)

答案 3 :(得分:0)

您还可以在模型中将只读字段设置为editable=Falseeditable here的Django文档参考)。然后在Admin中覆盖get_readonly_fields方法。

# models.py
class MyModel(models.Model):
  first = models.CharField(max_length=255, editable=False)

# admin.py
class MyModelAdmin(admin.ModelAdmin):
  def get_readonly_fields(self, request, obj=None):
    return [f.name for f in obj._meta.fields if not f.editable]

答案 4 :(得分:0)

使用上述解决方案,我能够显示多个对象的隐藏字段,但在尝试添加新对象时出现异常。

所以我对其进行了如下增强:

class HiddenFieldsAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
    try:
        return [f.name for f in obj._meta.fields if not f.editable]
    except:
        # if a new object is to be created the try clause will fail due to missing _meta.fields
        return ""

在相应的 admin.py 文件中,我只需要导入新类并在注册新模型类时添加它

from django.contrib import admin
from .models import Example, HiddenFieldsAdmin

admin.site.register(Example, HiddenFieldsAdmin)

现在我可以在具有不可编辑字段的每个类中使用它,到目前为止我没有看到不需要的副作用。