Разрешение на просмотр, но не менять! - Django

можно разрешить пользователям просматривать, но не изменять или удалять.

в настоящее время в единственных разрешениях, которые я вижу, это "добавить", "изменить" и "удалить"... но там нет "read/view".

Мне действительно нужно это, так как некоторые пользователи смогут только проконсультироваться с административной панелью, чтобы увидеть, что было добавлено.

Ответ 1

В 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 %}

Ответ 2

Вы можете использовать приложение django-admin-view-permission:

pip install django-admin-view-permission

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

ОБНОВИТЬ:

Django 2.1 имеет разрешение на просмотр из коробки.

Ответ 3

Вы не можете просто просматривать вещи в admin django.

Для этого есть databrowse.

Ответ 4

Одним из обходных путей было бы иметь дополнительное разрешение "сохранить" на вашей модели и проверить метод modeladmin save_model, если у пользователя есть эти разрешения, если он этого не сделал, это означало бы, что он может делать все в этом modeladmin, кроме сохраненных отредактированных данных!

Ответ 5

Предоставить образец Бернхарду Валланту, упомянутому выше. В моем файле 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, где я бы хотел, чтобы они просматривали только журнал. Но другое название группы может сохранять любые изменения.

Ответ 6

Вы можете сделать это следующим образом:

1) Вы можете сделать поля прочитанными, только если объект был создан. Но при этом никто не сможет изменять поля

2) Вы можете использовать просмотр данных

3) Вы можете использовать проверку формы, если пользователь не находится в выбранном списке, проверяя ошибку проверки, если какое-либо поле было изменено.

4) вы можете создать представление, если пользователь находится в вашем списке, затем перенаправить его на обычный поток или перенаправить его на простую страницу html readonly

5) Используйте jquery, чтобы сделать поля только для чтения, а пользователь не входит в список и переопределяет метод сохранения для проверки любой умности. В вашем методе сохранения вы бросаете ошибку, любая форма была изменена, а пользователя нет в вашем списке .username = request.user.username

Ответ 7

Вы также можете переопределить ModelAdmin.change_view (как указано в документах Django). Просто убедитесь, что вы также переопределите save_model, чтобы убедиться, что пользователь не может обновить данные.

Ответ 8

Дубликат: fooobar.com/questions/92694/...

См. 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 %}

шаблоны /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 %}

Ответ 9

У меня есть обходное решение, которое должно пожертвовать разрешением только разрешения. В шаблоне администратора 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 %}

Это далеко не чистое и по-прежнему позволяет пользователю изменять данные, если предлагаются другие способы помимо стандартной формы администратора, но, возможно, достаточно, если вы просто хотите защитить сотрудников от случайных изменений данных, они не должны.