Ver permisos en Django [duplicado]

Esta pregunta ya tiene una respuesta aquí:

¡Permiso para ver, pero no para cambiar! - Django 12 respuestas

Como el administrador de django tiene tres permisos en su autenticación: ¡agregar, cambiar, eliminar! Quiero agregar permisos de visualización en esta autenticación en el panel de administración. ¡Sé que tengo que personalizar los permisos para agregar permisos de visualización en 'autorización | permiso de visualización | para ver todas las entradas!

LA MANERA:

[X] 1. Se agregó 'vista' a la lista de permisos predeterminada

#./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. Probar el permiso 'ver' se agrega a todos los modelos

run manage.py syncdb

Confirmé que ahora se agrega permiso de vista para todas las tablas en la tabla auth_permissions

[X] 3. Agregue "get_view_permission" a la clase de modelo predeterminada.

Se agregó get_view_permission a la clase de modelo. Puede encontrar esto en el archivo ./db/models/options.py. Esto es utilizado por la clase admin en el siguiente paso.

def get_view_permission(self):

    return 'view_%s' % self.object_name.lower()

[X] 4. Agregue "has_view_permission" a la clase de administrador predeterminada

Para ser coherente, voy a agregar "has_view_permission" al sistema. Parece que debería estar en algún lugar decontrib / admin / options.py. Asegúrese de que si el usuario tiene permiso de cambio, los permisos de visualización están implícitos automáticamente.

# /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. Actualice la plantilla predeterminada para enumerar modelos si el usuario tiene permiso para ver

Modifiqué la plantilla predeterminada en contrib / admin / templates / admin / index.html. Esto también podría manejarse copiando el archivo en el directorio de plantillas locales. Hice cambios en ambos, así que tengo una copia si una actualización posterior sobrescribe mis cambios.

{% 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. Confirme que el usuario puede "ver" pero no "cambiar" el modelo

Parece que contrib / admin / templatetags / admin_modify.py controla los botones guardar / guardar y continuar que aparecen o no. Se cambió el campo "guardar" del valor predeterminado de siempre Verdadero, para verificar el contexto y los permisos. El usuario debe poder guardar si tiene cambios o agrega permisos.

'show_save': (change and context['has_change_permission']) or (context['add'] and context['has_add_permission'])

[X] 7. Quite el botón "Guardar y agregar otro" si el usuario está viendo un elemento

Contr / admin / templatetags / admin_modify.py modificado nuevamente. No sé qué significa 'save_as', así que tal vez rompí algo, pero parece funcionar.

#'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. Modifique el permiso "ver" para que el formulario sea de solo lectura

Si el usuario tiene permiso de "vista" y permiso de "cambio", no haga nada. El cambio anula la vista.

Si el usuario tiene permiso de "vista" sin "cambio", cambie los formularios predeterminados y agregue atributos DESACTIVADOS o READONLY a los elementos del formulario. No todos los navegadores admiten esto, pero para mis propósitos puedo requerir que los usuarios usen el correcto. [Ejemplo deshabilitado / solo lectura] [1]

Se descubrió que no todos los navegadores respetan "solo lectura", por lo que establece algunos controles para solo lectura, otros para deshabilitado. Esto permite a los usuarios copiar datos de los controles de texto si es necesario.

#/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 %}

FUENTE DE RESPUESTA¿Cómo puedo MODIFICAR django para crear el permiso "ver"?

Pregunta: Después de seguir la respuesta anterior, lo hice y puedo ver esta página 127.0.0.1:8000/en-us/admin/ como solo lectura ** pero los usuarios de los usuarios no están visibles 127.0.0.1:8000/en-us/ administrador / usuario . ¡Necesitas ayuda!**

Respuestas a la pregunta(2)

Su respuesta a la pregunta