Поскольку у администратора django есть три разрешения на авторизацию: добавить, изменить, удалить! Я хочу добавить разрешение на просмотр в эту авторизацию в панели администратора. Я знаю, что мне нужно настроить разрешения, чтобы добавить разрешение на просмотр в «авторизация | разрешение | разрешение на просмотр» для просмотра всех записей!
СПОСОБ:
[X] 1. Добавлено «просмотр» в список разрешений по умолчанию.
#./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. Проверьте, что разрешение «просмотр» добавлено ко всем моделям.
run manage.py syncdb
Я подтвердил, что разрешение на просмотр теперь добавлено для всех таблиц в таблице auth_permissions.
[X] 3. Добавить "get_view_permission" в класс модели по умолчанию.
В класс модели добавлен get_view_permission. Вы можете найти это в файле ./db/models/options.py. Он используется классом администратора на следующем шаге.
def get_view_permission(self):
return 'view_%s' % self.object_name.lower()
[X] 4. Добавить «has_view_permission» в класс администратора по умолчанию.
Чтобы быть последовательным, я добавлю в систему «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, по-видимому, контролирует появление или отсутствие кнопок сохранения/сохранения и продолжения. Поле «сохранить» изменено по умолчанию на всегда True, чтобы проверить контекст и разрешения. Пользователь должен иметь возможность сохранять, если у него есть права на изменение или добавление.
'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. Изменить разрешение «просмотр», чтобы сделать форму только для чтения
Если у пользователя есть разрешение «просмотр» и разрешение «изменить», ничего не делайте. Изменение переопределяет вид.
Если у пользователя есть разрешение «просмотр» без «изменения», измените формы по умолчанию и добавьте атрибуты DISABLED или READONLY к элементам формы. Не все браузеры поддерживают это, но для моих целей я могу потребовать, чтобы пользователи использовали правильный браузер. [Отключено/пример только для чтения][1]
Обнаружено, что не все браузеры соблюдают режим «только для чтения», поэтому некоторые элементы управления устанавливаются только для чтения, а другие — отключены. Это позволяет пользователям копировать данные из текстовых элементов управления, если это необходимо.
#/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 на создать разрешение на просмотр?
Вопрос: после ответа выше я сделал и могу видеть эту страницу 127.0.0.1:8000/en-us/admin/ только для чтения ** но пользователи в пользователях не видны 127.0.0.1:8000/en -нас/админ/пользователь . Нужна помощь!**
127.0.0.1:8000/en-us/admin/user
, разве это не должно быть127.0.0.1:8000/en-us/admin/auth/user
? - person elssar   schedule 28.04.2014