【问题标题】:How to make Django model just view (read-only) in Django Admin?如何使 Django 模型在 Django Admin 中仅查看(只读)?
【发布时间】:2013-12-16 11:35:50
【问题描述】:

这个问题是How to remove Add button in Django admin, for specific Model?的延续

我意识到我的第一个问题表述得不好,所以我坚持认为最好是开始新问题,以解决旧问题。因为已经有了一些答案。

所以问题是如何制作只读的 Django 模型。这样您就无法添加新的、删除旧的、更改当前的,但您在 Web 管理 UI 上也没有相应的按钮。

第一个问题的解决方案都与字段有关,但与整个模型无关。
它们都有效,从某种意义上说,您将无法编辑这些字段,但我对它们的操作方式不满意。
目前的解决方案是:

  1. 在模型的所有字段上使用readonly_fields -> 我不喜欢它,因为您可以单击行来更改它,但您不能编辑字段。
  2. editable=False 已提交定义 -> 这不会在 Web 管理 UI 上显示该字段。但是您仍然可以单击行,但是您将什么也看不到,并且仍然有保存按钮。
  3. def has_add_permission(self, request): -> 同 2
  4. 不要给任何人添加此模型的权限 -> 同 2

有什么想法吗?

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    您需要将 ModelAdmin 类的 list_display_links 属性设置为 (None,)。但这只能在标准 ModelAdmin __init__ 调用之后的 __init__ 中完成,否则它将抛出带有文本 ... list_display_links[0]' refers to 'None' which is not defined in 'list_display'ImproperlyConfigured 异常。而且你应该定义has_add_permisssion 来隐藏添加按钮:

    class AmountOfBooksAdmin(admin.ModelAdmin):
        actions = None # disables actions dropbox with delete action
        list_display = ('book', 'amount')
    
        def has_add_permission(self, request):
            return False
    
        def __init__(self, *args, **kwargs):
            super(AmountOfBooksAdmin, self).__init__(*args, **kwargs)
            self.list_display_links = (None,)
    
        # to hide change and add buttons on main page:
        def get_model_perms(self, request): 
            return {'view': True}
    

    要从 madin 管理页面隐藏“查看”和“更改”按钮,您必须将 django/contrib/admin/templates/admin/ 中的 index.html 放置到模板目录 /admin 并进行更改:

        {% for model in app.models %}   
            ...
    
            {% if model.perms.view %}       
                <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
            {% else %}
                {% if model.admin_url %}
                    <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
                {% else %}
                    <th scope="row">{{ model.name }}</th>
                {% endif %}
            {% endif %}
    
            ....
    

    【讨论】:

    • 这是部分正确的。问题是在127.0.0.1:8000/admin 的主页上仍然有“添加”和“更改”按钮。单击更改按钮会将您带到书籍列表,没关系,但无论如何我认为“更改”按钮不应该显示。但是当您单击“添加”按钮时,您会看到不太好的“403 Forbiden”页面。如果您知道如何删除此“添加”和“更改”按钮,请说。比你到目前为止的帮助。
    猜你喜欢
    • 2011-03-08
    • 2019-02-10
    • 2016-08-04
    • 2015-11-21
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2011-08-25
    相关资源
    最近更新 更多