Разрешение на просмотр, но не менять! - 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, но никогда не видят кнопки для отправки изменений, которые они сделали.
Изменения, которые я сделал:
с
{# Use change permission only as read only #}
{% if has_change_permission and has_add_permission %}
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
{% endif %}
Это далеко не чистое и по-прежнему позволяет пользователю изменять данные, если предлагаются другие способы помимо стандартной формы администратора, но, возможно, достаточно, если вы просто хотите защитить сотрудников от случайных изменений данных, они не должны.