Django管理员,如何在查看和编辑期间隐藏特定的模型字段

时间:2019-02-26 08:58:27

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

我有一个Django模型 A ,该模型在django管理员上注册,管理员用户可以在其中添加/编辑数据。

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

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

我尝试在admin中使用以下代码段:

#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
...

但是,如果我在编辑视图中打开模型并单击保存,它将db中的private_key替换为NULL,这意味着该值未从前端传递,这是正确的,因为我们排除了该字段,但是在保存时它的值被覆盖为NULL,您知道如何解决此问题吗?

2 个答案:

答案 0 :(得分:0)

要隐藏该字段,请在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添加到只读字段中

答案 1 :(得分:0)

根据您的问题,我相信您只希望在创建对象时才能看到“ private_key”。

您可以重写get_fields方法。如果您希望“ private_key”仅在创建Object时可见,则可以执行以下操作。

从列表显示中删除“ private_key”(如果有的话),并且还希望从列表显示中删除它。如果要在列表视图中显示,请添加到list_display。

//add a port
var port = {
  id: "my_port_id"
};

var sourceElement = this.findElement(my_element_id);
sourceElement.addPort(port);
sourceElement.portProp("my_port_id", "attrs/circle/fill", "#f2f2f2");
sourceElement.portProp("my_port_id", "attrs/label/position/name", "outsideOriented");
sourceElement.portProp("my_port_id", "attrs/text/text", "some port label");

//add link
var link = new joint.dia.Link({
  source: {
    id: sourceElement.Id,
    port: "my_port_id"
  },
  target: {
    id: targetElement.id
  }
});
this.graph.addCell(link);