如何使Django模型只在Django Admin中查看(只读)



这个问题是如何删除Django管理中的Add按钮的延续,针对特定的Model?

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

所以问题是如何使Django模型成为只读视图。这样你就不能添加新的、删除旧的、更改当前的,但你也没有在web管理UI上的按钮。

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

  1. 对模型中的所有字段使用readonly_fields->我不喜欢它,因为您可以单击行来更改它,但不能编辑字段
  2. 字段定义上的editable=False->这不会在web管理UI上显示字段。但你们仍然可以点击行,但你们不会看到任何东西,并且仍然有保存按钮
  3. def has_add_permission(self, request):->与2相同
  4. 不要向任何人授予此模型的添加权限->与2相同

有什么想法吗?

您需要将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管理页面隐藏"查看"one_answers"更改"按钮,您必须将index.html从django/contrib/admin/templates/admin/放置到templates-dir/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 %}
        ....

最新更新