【问题标题】:Django admin, how to hide a specific model field during view and editDjango admin,如何在查看和编辑期间隐藏特定模型字段
【发布时间】:2019-07-19 18:30:17
【问题描述】:

我有一个 django 模型 A,这个模型在 django admin 上注册,管理员用户可以从那里添加/编辑数据。

#models.py
class A(models.Model):
    eth_address = models.CharField( max_length=100)
    private_key = encrypt(max_length=100))

现在我想要这样,一旦将数据添加到数据库,在编辑或查看时,我不希望 private_key 字段在 UI 上可见。

我尝试在管理员中使用以下 sn-p :

#admin.py
...
 def get_form(self, request, obj=None, **kwargs):
    self.exclude = ("private_key", )
    form = super(AAdmin, self).get_form(request, obj, **kwargs)
    return form
...

但是,如果我在编辑视图中打开模型并点击保存,它会将数据库中的 private_key 替换为 NULL,这意味着该值不是从前端传递的,这是真的,因为我们排除了该字段,但是在保存时它的值被覆盖为 NULL,知道如何解决这个问题吗?

【问题讨论】:

  • 尝试在admin.py中添加list_display=['eth_address']
  • 我不想在列表中显示它

标签: django python-3.x django-models django-admin


【解决方案1】:

要隐藏该字段,请在 ModelAdmin 类上覆盖 change_view 并排除该字段

def change_view(self, request, object_id, extra_context=None):
    self.exclude = ('private_key', )
    return super().change_view(request, object_id, extra_context)

如果你想在编辑时以只读方式查看它,你想覆盖 get_readonly_fields 函数,比如

def get_readonly_fields(self, request, obj=None):
    if obj:
        return ['private_key',]
    else: 
        return []

所以你检查 obj 是否已经存在,这使它成为一个编辑,并将 private_key 添加到只读字段

【讨论】:

  • 这会将该字段添加到排除实例字段中,下次它不会出现在 crate 视图页面上。
【解决方案2】:

根据您的问题,我相信您希望“private_key”仅在创建对象时可见。

您可以覆盖 get_fields 方法。如果您希望“private_key”仅在创建对象时可见,您可以执行以下操作。

如果你有一个'private_key'并且你想从列表显示中删除它,请从list_display中删除它。如果要在列表视图中显示,请添加到 list_display。

class AModelAdmin(admin.ModelAdmin):
    list_display = ['eth_address']

    def get_fields(self, request, obj=None):
        fields = super().get_fields(request, obj)
        if obj:
            fields.remove('private_key')
        return fields


admin.site.register(A, AAdmin)

【讨论】:

    猜你喜欢
    • 2011-10-08
    • 2016-05-31
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多