Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django管理员,如何在查看和编辑期间隐藏特定模型字段_Django_Python 3.x_Django Models_Django Admin - Fatal编程技术网

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

Django管理员,如何在查看和编辑期间隐藏特定模型字段,django,python-3.x,django-models,django-admin,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)) 现在我希望,一旦数据添加到数据库中,在编辑或查看时,我不希望私有密钥字段在UI上可见 我尝试在admin中使用以下代码段: #admin.p

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

#models.py
class A(models.Model):
    eth_address = models.CharField( max_length=100)
    private_key = encrypt(max_length=100))
现在我希望,一旦数据添加到数据库中,在编辑或查看时,我不希望私有密钥字段在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
...

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

为了隐藏该字段,覆盖ModelAdmin类上的
change\u视图
,并排除该字段

def change_view(self, request, object_id, extra_context=None):
    self.exclude = ('private_key', )
    return super().change_view(request, object_id, extra_context)
如果要在编辑时以只读方式查看它,则需要覆盖
get\u readonly\u fields
函数,如

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

因此,您需要检查obj是否已经存在,这使其成为一个编辑,并根据您的问题将私钥添加到只读字段中。我相信您希望“私钥”仅在创建对象时可见

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

如果您有“私钥”,并且希望将其从列表显示中删除,请从列表显示中删除“私钥”。如果要在列表视图中显示,请添加到列表显示

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)

尝试在
admin.py
中添加
list\u display=['eth\u address']
我不想在列表中显示它这将在排除实例字段中添加该字段,下次它将不会出现在板条箱视图页面上。