如何在Django Admin中将Django模型设置为只读视图?

4
这个问题是如何移除Django管理界面中特定模型的添加按钮?的延续。
我意识到我的第一个问题表述不够清楚,所以我认为最好开始一个新问题来修复旧问题。因为已经有一些答案了。
所以问题是如何创建一个Django模型,使其只读。这样你就不能添加新的、删除旧的、更改当前的,但你也没有在Web管理员界面上的按钮。
第一个问题的解决方案都涉及到字段,而不是整个模型。它们都能起作用,意味着你将无法编辑这些字段,但我对它们的工作方式不满意。
当前的解决方案是:
  1. 在模型的所有字段上使用readonly_fields——我不喜欢这种方式,因为你可以点击行来改变它,但你不能编辑字段。
  2. 在字段定义中使用editable=False——这将不显示字段在Web管理界面上。但是你仍然可以点击行,只是看不到任何东西,并且仍然有保存按钮。
  3. def has_add_permission(self, request):——与2相同。
  4. 不要给任何人在此模型上添加权限——与2相同。

有什么想法吗?

1个回答

3

您需要将ModelAdmin类的list_display_links属性设置为(None,)。但是只能在标准ModelAdmin __init__调用后的__init__中完成,否则它将抛出ImproperlyConfigured异常,其中文本为... list_display_links [0] 'refers to' None 'which is not defined in' list_display '

无论如何,您都应该定义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}

为了在管理后台页面中隐藏“查看”和“更改”按钮,您需要将来自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 %}

        ....

这部分是正确的。问题在于在http://127.0.0.1:8000/admin/的主页面上仍然有“添加”和“更改”按钮。点击更改按钮会带您进入书籍列表,这是可以的,但无论如何我认为不应该显示“更改”按钮。但是当您单击“添加”按钮时,会出现“403禁止访问”的页面,这并不好。如果您知道如何删除此“添加”和“更改”按钮,请告诉我。感谢您迄今为止的帮助。 - WebOrCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接