Поскольку у django admin есть три разрешения в нем: добавление, изменение, удаление! Я хочу добавить разрешение на просмотр в этом auth в панели admin.I знаю, что мне нужно настроить разрешения для добавления разрешения на просмотр в 'auth | permission\can view permission' для просмотра всех записей!
ПУТЬ:
[X] 1. Добавлен список просмотров 'default' по умолчанию
#./contrib/auth/management/init.py
def _get_all_permissions(opts):
"Returns (codename, name) for all permissions in the given opts."
perms = []
for action in ('add', 'change', 'delete', 'view'):
perms.append((_get_permission_codename(action, opts), u'Can %s %s' % (action, opts.verbose_name_raw)))
return perms + list(opts.permissions)
[X] 2. Тестирование разрешения 'view' добавляется ко всем моделям
run manage.py syncdb
Я подтвердил, что теперь разрешено разрешение просмотра для всех таблиц в таблице auth_permissions
[X] 3. Добавьте "get_view_permission" к классу модели по умолчанию.
Добавлен get_view_permission в класс модели. Это можно найти в файле. /db/models/options.py Это используется классом admin на следующем шаге.
def get_view_permission(self):
return 'view_%s' % self.object_name.lower()
[X] 4. Добавьте "has_view_permission" к классу admin по умолчанию
Чтобы быть последовательным, я собираюсь добавить "has_view_permission" в систему. Похоже, он должен быть где-то в contrib/admin/options.py. Убедитесь, что у пользователя есть разрешение на изменение, затем автоматически отображаются разрешения на просмотр.
# /contrib/admin/options.py
# Added has_view_permissions
def has_view_permission(self, request, obj=None):
"""
Returns True if the given request has permission to change or view
the given Django model instance.
If obj is None, this should return True if the given request has
permission to change *any* object of the given type.
"""
opts = self.opts
return self.has_change_permission(request, obj) or \
request.user.has_perm(opts.app_label + '.' + opts.get_view_permission())
# modified get_model_perms to include 'view' too.
# No idea where this may be used, but trying to stay consistent
def get_model_perms(self, request):
"""
Returns a dict of all perms for this model. This dict has the keys
add, change, and delete and view mapping to the True/False
for each of those actions.
"""
return {
'add': self.has_add_permission(request),
'change': self.has_change_permission(request),
'delete': self.has_delete_permission(request),
'view': self.has_view_permission(request),
}
# modified response_add function to return the user to the mode list
# if they added a unit and have view rights
...
else:
self.message_user(request, msg)
# Figure out where to redirect. If the user has change permission,
# redirect to the change-list page for this object. Otherwise,
# redirect to the admin index.
#if self.has_change_permission(request, None):
if self.has_change_permission(request, None) or self.has_view_permission(request, None):
post_url = '../'
else:
post_url = '../../../'
return HttpResponseRedirect(post_url)
# modified the change_view function so it becomes the details
# for users with view permission
#if not self.has_change_permission(request, obj):
if not (self.has_change_permission(request, obj) or (self.has_view_permission(request, obj) and not request.POST)):
raise PermissionDenied
# modified the changelist_view function so it shows the list of items
# if you have view permissions
def changelist_view(self, request, extra_context=None):
"The 'change list' admin view for this model."
from django.contrib.admin.views.main import ChangeList, ERROR_FLAG
opts = self.model._meta
app_label = opts.app_label
#if not self.has_change_permission(request, None):
if not (self.has_change_permission(request, None) or self.has_view_permission(request, None)):
raise PermissionDenied
[X] 5. Обновите шаблон по умолчанию, чтобы просмотреть модели, если у пользователя есть разрешение на просмотр.
Я изменил шаблон по умолчанию в contrib/admin/templates/admin/index.html. Это также может быть выполнено путем копирования файла в каталог локальных шаблонов. Я внес изменения в оба варианта, поэтому у меня есть копия, если последующее обновление перезаписывает мои изменения.
{% for model in app.models %}
<tr>
{% if model.perms.change %}
<th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
{% else %}
{% if model.perms.view %}
<th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
{% else %}
<th scope="row">{{ model.name }}</th>
{% endif %}
{% endif %}
[X] 6. Подтвердите, что пользователь может "просматривать", но не "изменять" модель.
Найдено вкладка contrib/admin/templatetags/admin_modify.py для управления кнопками сохранения/сохранения и продолжения. Изменено поле "сохранить" по умолчанию всегда "Истина", чтобы проверить контекст и разрешения. Пользователь должен иметь возможность сохранять, если они имеют изменения или добавлять разрешения.
'show_save': (change and context['has_change_permission']) or (context['add'] and context['has_add_permission'])
[X] 7. Удалите кнопку "Сохранить и добавить другую", если пользователь просматривает элемент
Изменен вкладчик contrib/admin/templatetags/admin_modify.py. Я не знаю, что означает "save_as", поэтому, возможно, я что-то сломал, но, похоже, он работает.
#'show_save_and_add_another': context['has_add_permission'] and
# not is_popup and (not save_as or context['add']) ,
'show_save_and_add_another': not is_popup and
(( change and context['has_change_permission']) or (context['add'] and context['has_add_permission']))
and
(not save_as or context['add']),
[X] 8. Измените разрешение "view", чтобы сделать форму только для чтения
Если пользователь имеет разрешение "просмотреть" и "изменить", то ничего не делать. Изменение переопределения.
Если пользователь имеет разрешение "просмотреть" без "изменения", измените формы по умолчанию и добавьте атрибуты DISABLED или READONLY в элементы формы. Не все браузеры поддерживают это, но для моих целей я могу потребовать, чтобы пользователи использовали правильный. [Отключено/пример чтения] [1]
Обнаружил, что не все браузеры чтят "readonly", поэтому он устанавливает некоторые элементы управления для чтения, а другие - отключен. Это позволяет пользователям при необходимости копировать данные из текстовых элементов.
#/django/contrib/admin/templates/admin/change_form.html
{# JavaScript for prepopulated fields #}
{% prepopulated_fields_js %}
</div>
</form></div>
{% if has_view_permission and not has_change_permission %}
<script type="text/javascript">
jQuery('input:text').attr('readonly', 'readonly');
jQuery('textarea').attr('readonly', 'readonly');
jQuery('input:checkbox').attr('disabled', true);
jQuery('select').attr('disabled', true);
jQuery('.add-another').hide();
</script>
{% endif %}
ИСТОЧНИК ОТВЕТОВ: Как я могу ИЗМЕНИТЬ django для создания "view" разрешение?
Вопрос: После следующего выше ответа я сделал и могу видеть эту страницу 127.0.0.1:8000/en-us/admin/как доступную только для чтения **, но пользователи в пользователях не видны 127.0.0.1: 8000/ru-ru/admin/user. Нужна помощь! **