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

时间:2013-11-30 11:50:46

标签: django django-models django-admin

这个问题是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相同
  5. 有什么想法吗?

1 个答案:

答案 0 :(得分: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}

要从madin管理页面隐藏“查看”和“更改”按钮,您必须将index.html从django / contrib / admin / templates / admin /放到模板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 %}

        ....