如何在Django admin UI中为只有“查看”权限的用户添加自定义显示?

scyqe7ek  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(111)

如果我想在Django管理界面中更改添加或更改对象的方式,我可以简单地覆盖form(docs)。
对于一个只有“查看”权限(没有添加,没有更改,没有删除)的用户,表单甚至不会显示。
如果我想更改一个对象在管理UI中的显示方式,为一个在“详细页面”上只有“查看”权限的用户,我该怎么做?
P.S.当我说的“详细页面”时,我指的是当你点击列表视图中的对象时呈现的页面。URL以“change”结尾,但没有更改权限的用户不能更改任何内容。

EDIT:是否可以更改表单模板?
编辑2:询问这个问题的相关方式可能是:如何在更改表单上显示只读字段,以及如何自定义只读字段显示?我认为如果你没有“更改”权限,它会将字段呈现为只读。
EDIT 3This answer表示不能自定义只读字段。所以也许这是不可能的?

e3bfsja2

e3bfsja21#

我最后说:

  • 在我的模型管理上重载change_view。在change_view中,我把widget_html放在extra_context中。
  • change_form_template设置为使用the widget_html的模板,如下所示:
{% extends "admin/change_form.html" %}
{% block after_field_sets %}

    {% if not has_change_permission %}
        {# Display a read-only/disabled version of my widget #}
        <div class="form-row">
            <b>Field name:</b>{{widget_html}}
        </div>
    {% endif %}

{% endblock %}

字符串
感觉有点怪,但很有效。
由于我的小部件有可编辑的部分,我在change_view中使用attrs={"disabled": True}渲染它:

if not self.has_change_permission(request):
    # Fetch the object, since self.model seems not bound?
    the_model = MyObject.objects.get(pk=object_id)
    widget_html = MyWidget().render(
        "field_name",
        the_model.the_field,
        # disable the widget so it is not editable
        attrs={"disabled": True},
    )
    extra_context |= {
        "widget_html": widget_html,
    }


这使得UI不可改变(例如,下拉菜单不下拉)。让我的小部件对只读标志做出React并以不同的方式呈现会更好,但我的动作很快,这就做到了。

相关问题