Тъй като администраторът на django има три разрешения в своя auth: добавяне, промяна, изтриване! Искам да добавя разрешение за преглед в това удостоверяване в администраторския панел. Знам, че трябва да персонализирам разрешенията, за да добавя разрешение за преглед в „auth|permission|can view permission“, за да виждам всички записи!
НАЧИНЪТ:
[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="/bg{{ model.admin_url }}">{{ model.name }}</a></th>
{% else %}
{% if model.perms.view %}
<th scope="row"><a href="/bg{{ 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 -us/admin/user. Нужда от помощ!**
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