查看权限,但不能更改! - Django

时间:2010-06-18 10:30:39

标签: python django django-admin

是否可以授予用户查看权限,但不能更改或删除。

目前我看到的唯一权限是“添加”,“更改”和“删除”...但是那里没有“阅读/查看”。

我真的需要这个,因为有些用户只能咨询管理面板,以便查看已添加的内容。

11 个答案:

答案 0 :(得分:18)

在admin.py

# Main reusable Admin class for only viewing
class ViewAdmin(admin.ModelAdmin):

    """
    Custom made change_form template just for viewing purposes
    You need to copy this from /django/contrib/admin/templates/admin/change_form.html
    And then put that in your template folder that is specified in the 
    settings.TEMPLATE_DIR
    """
    change_form_template = 'view_form.html'

    # Remove the delete Admin Action for this Model
    actions = None

    def has_add_permission(self, request):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

    def save_model(self, request, obj, form, change):
        #Return nothing to make sure user can't update any data
        pass

# Example usage:
class SomeAdmin(ViewAdmin):
    # put your admin stuff here
    # or use pass

在change_form.html中替换它:

{{ adminform.form.non_field_errors }}

用这个:

<table>
{% for field in adminform.form %}
    <tr>
      <td>{{ field.label_tag }}:</td><td>{{ field.value }}</td>
    </tr>
{% endfor %}
</table>

然后删除此行删除提交按钮:

{% submit_row %}

答案 1 :(得分:6)

您可以使用the django-admin-view-permission application

pip install django-admin-view-permission

INSTALLED_APPS = [
    'admin_view_permission',
    'django.contrib.admin',
    ...
]

更新:

Django 2.1具有开箱即用的查看权限。

答案 2 :(得分:3)

你不能只在django admin中查看内容。

有一个databrowse应用程序。

答案 3 :(得分:3)

一种解决方法是在模型上获得额外的“保存”权限,并检查modeladmin的save_model方法,如果用户具有此权限,如果他没有,则意味着他可以执行此操作modeladmin,保存编辑数据除外!

答案 4 :(得分:3)

为上面提到的Bernhard Vallant提供样品。在我的admin.py文件中,我会放置

class LogBookAdmin(admin.ModelAdmin):
    list_display        = ['dateEntry','due_date', 'controlNo', 'carrier', 'status']    
    exclude             = ['encoder_status', 'engr_status', 'chief_status', 'ischecked']

    def save_model(self, request, obj, form, change):     
        if request.user.groups.filter(name='Encoder').exists():
            pass
        else:
            return super(LogBookAdmin, self).save_model(request, obj, form, change)

假设我有一个组名Encoder,我希望他们只能查看日志。但是其他组名可以保存任何更改。

答案 5 :(得分:2)

您可以通过以下方式执行此操作:

1)如果对象已经创建,您可以将字段设为只读。但是这样做没有人能够更改字段

2)您可以使用数据表

3)您可以使用表单验证,如果用户不在所选列表中,则在任何字段更改时抛出验证错误

4)你可以创建一个视图,如果用户在你的列表中然后将其重定向到正常流程,或者将他重定向到简单的html readonly页面

5)使用jquery使字段只读用户不在列表中并覆盖save方法以检查任何智能。在save方法中,抛出错误,任何表单都已更改,用户不在list.username = request.user.username

答案 6 :(得分:0)

您也可以覆盖ModelAdmin.change_view(如Django文档中所述)。只需确保您还覆盖save_model以确保用户无法更新数据

答案 7 :(得分:0)

重复:https://stackoverflow.com/a/33543817/101831

请参阅https://djangosnippets.org/snippets/10539/

class ReadOnlyAdminMixin(object):
    """Disables all editing capabilities."""
    change_form_template = "admin/view.html"

    def __init__(self, *args, **kwargs):
        super(ReadOnlyAdminMixin, self).__init__(*args, **kwargs)
        self.readonly_fields = self.model._meta.get_all_field_names()

    def get_actions(self, request):
        actions = super(ReadOnlyAdminMixin, self).get_actions(request)
        del actions["delete_selected"]
        return actions

    def has_add_permission(self, request):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

    def save_model(self, request, obj, form, change):
        pass

    def delete_model(self, request, obj):
        pass

    def save_related(self, request, form, formsets, change):
        pass

<强>模板/管理/ view.html

{% extends "admin/change_form.html" %}
{% load i18n %}

{% block submit_buttons_bottom %}
  <div class="submit-row">
    <a href="../">{% blocktrans %}Back to list{% endblocktrans %}</a>
  </div>
{% endblock %}

templates / admin / view.html(适用于Grappelli)

{% extends "admin/change_form.html" %}
{% load i18n %}

{% block submit_buttons_bottom %}
  <footer class="grp-module grp-submit-row grp-fixed-footer">
    <header style="display:none"><h1>{% trans "submit options"|capfirst context "heading" %}</h1></header>
    <ul>
       <li><a href="../" class="grp-button grp-default">{% blocktrans %}Back to list{% endblocktrans %}</a></li>
    </ul>
  </footer>
{% endblock %}

答案 8 :(得分:0)

我有一个解决方法,只需要牺牲更改权限。在管理模板change_form.html中,我检查模板中的添加更改权限,并仅在用户同时具有这两种权限时才显示submit_row。因此,具有更改权限的用户只能查看change_list和change_form,但从不会看到按钮提交他们所做的更改。

我所做的改变:

  • 在我的应用模板目录中创建目录,例如myapp/templates/admin/myapp/
  • 拉入目录中的change_form.html
  • 替换

    {% block submit_buttons_bottom %}{% submit_row %}{% endblock %}

{# Use change permission only as read only #}
{% if has_change_permission and has_add_permission %}
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
{% endif %}

这远非干净,如果提供除标准管理表单之外的其他方式,仍然允许用户更改数据,但如果您只是想保护员工不会意外更改数据,那么可能就足够了。

答案 9 :(得分:0)

我在这里可以看到建议的答案,因为我在自己上面尝试了所有上述答案,您可能会面临比自己需要解决的问题更多的问题。我终于想通了:

我在Django Admin Cookbook中找到的方法是,在创建/添加时使要编辑的字段可编辑,但以后才可编辑。换句话说,一旦创建对象,则该链接提供的该方法中覆盖的任何字段将都是只读的,一旦添加到数据库模型中,您将无法对其进行编辑。

答案 10 :(得分:0)

这是一个很老的话题,大多数人已经知道了,但是... Django 2.0内置了view_permissions link to awesome view permissions