【问题标题】:Make a django readonly field visible on the admin使 django 只读字段在管理员上可见
【发布时间】:2023-04-08 05:55:01
【问题描述】:

我正在开发一个 Django 项目,我希望允许用户仅在 add_view 上编辑特定字段。所以我已经覆盖了 admin.py 上的 change_view 方法,所以它可以在那里设置我的 readonly_fields。但是 Django 不会显示 readonly_fields。

没有显示只读字段对我来说似乎很奇怪。我的意思是,如果它是只读的,它说读取的部分在哪里?它应该是可读的(仅),而不是可食用的。如果我想隐藏它,应该有一个名为 hidden_​​fields 的选项。你们不同意吗?

我想知道是否有任何直接的方法可以使我的管理员上的 readonly_fields 可见,但不可食用。

我的 admin.py 看起来像这样:

从 django.contrib 导入管理员 from core.models 导入框

class BoxAdmin(admin.ModelAdmin):
    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.readonly_fields = ('colour',)
        return super(BoxAdmin, self).change_view(request, object_id)

    def add_view(self, request, form_url='', extra_context=None):
        self.readonly_fields = []
        return super(BoxAdmin, self).add_view(request, extra_context=c)

【问题讨论】:

  • readonly_fields = ('colour',) 元组添加到您的BoxAdmin 类还不够吗?来自docs
  • 你确定它不存在吗?除非您明确设置fieldsfieldsets,否则readonly_fields 将出现在底部,毕竟所有可编辑字段。
  • @Gocht,好吧。看起来我必须在我的模型管理员上设置 fields 属性才能使 readonly_fields 工作。一旦文档上说 Django 将使用模型上设置的字段作为 ModelAdmin.fields 属性的默认字段集,这真的很奇怪。
  • 哦!事实上,它们出现在底部。对不起各位,我的错。我现在觉得自己很蠢很蠢。
  • AAARGH。花了我几个小时的生命。反正。谢谢。有没有办法把这个领域重新建立起来?

标签: python django


【解决方案1】:

您应该覆盖get_readonly_fields,而不是设置self.readonly_fields

def get_readonly_fields(request, obj=None):
    if obj is None:  # add form
        return []
    else:
        return ['colour']

【讨论】:

  • 我发现了问题所在,而这恰好与我缺乏注意力有关。实际上 Django 确实显示 readonly_fields 但我看不到它,因为当您不设置 ModelForm.fields 属性时它们显示在表单的底部,这几乎就是我的情况。还是谢谢。
  • ModelAdmin 对象被实例化一次,因此如果更改self.readonlu_fields 可能会影响同时浏览您网站的其他用户。所以我推荐上面的方法,即使现在你已经意识到你当前的代码正在屏幕底部显示字段。
  • 你是对的!我已经注意到并修复了。实际上我的用例考虑了用户权限。我创建了一个名为 Box_full_access 的权限。因此,我不是根据实例设置 readonly_fields,而是根据用户是否有 box_full_access 权限检查 change_view(),我设置 readonly_fields = [],否则 readonly_fields = ['color', 'field1', 'field2', ...]。
【解决方案2】:

我发现了问题所在,而这恰好与我的注意力不集中有关。实际上 Django 确实显示 readonly_fields 但我看不到它,因为它们显示在表单的底部。当您不设置 ModelForm.fields 属性时,它们会转到底部,这几乎就是我的情况。

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2014-11-26
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多