python - startapp - Permiso para ver, pero no para cambiar!-Django
python manage.py startapp (9)
es posible dar a los usuarios permiso para ver, pero no para cambiar o eliminar.
Actualmente, los únicos permisos que veo son "agregar", "cambiar" y "eliminar" ... pero no hay "lectura / visualización" allí.
Realmente necesito esto, ya que algunos usuarios solo podrán consultar el panel de administración para ver lo que se ha agregado.
Duplicar: https://.com/a/33543817/101831
Ver 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
templates / admin / 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 %}
templates / admin / view.html (para 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 %}
En 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
En change_form.html reemplaza esto:
{{ adminform.form.non_field_errors }}
con este:
<table>
{% for field in adminform.form %}
<tr>
<td>{{ field.label_tag }}:</td><td>{{ field.value }}</td>
</tr>
{% endfor %}
</table>
Luego elimine el botón de enviar eliminando esta fila:
{% submit_row %}
No puedes simplemente ver las cosas en el administrador de Django.
Hay una aplicación de databrowse para eso.
Para proporcionar la muestra a Bernhard Vallant mencione arriba. En mi archivo admin.py pondría
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)
Suponiendo que tengo un Encoder
nombre de grupo en el que me gustaría que solo vieran el Libro de registro. Pero otro nombre de grupo puede guardar cualquier cambio.
Puedes hacerlo de la siguiente manera:
1) Puede hacer que los campos sean de lectura solo si el objeto ha sido creado. Pero al hacerlo, nadie podrá cambiar los campos.
2) Puedes usar databrowse
3) Puede usar la validación de formulario, si el usuario no está en la lista seleccionada, lanzar error de validación si se cambia algún campo
4) puede crear una vista, si el usuario está en su lista, redirigirlo al flujo normal o redirigirlo a una simple página html de solo lectura
5) Use jquery para hacer que los campos sean de solo lectura si el usuario no está en la lista y anule el método de guardar para verificar cualquier inteligencia. En su método de guardar, se produce un error en cualquier formulario y el usuario no está en su lista.username = request.user nombre de usuario
Puedes usar la aplicación django-admin-view-permission :
pip install django-admin-view-permission
INSTALLED_APPS = [
''admin_view_permission'',
''django.contrib.admin'',
...
]
ACTUALIZAR:
Django 2.1 tiene un permiso de visualización fuera de la caja.
También puede anular ModelAdmin.change_view (como se indica en los documentos de Django). Solo asegúrese de anular save_model para asegurarse de que el usuario no pueda actualizar los datos
Tengo una solución que necesita sacrificar el permiso solo para el cambio . En la plantilla de administración change_form.html
compruebo los permisos de agregar y cambiar en la plantilla y mostrar el submit_row
solo si el usuario tiene ambos permisos. Por lo tanto, los usuarios con permiso de cambio solo pueden ver change_list y change_form, pero nunca ven los botones para enviar los cambios que han realizado.
Los cambios que hice:
- Crear un directorio en mi directorio de plantillas de aplicaciones como
myapp/templates/admin/myapp/
- Tire de
change_form.html
en el directorio Reemplazar
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
con
{# Use change permission only as read only #}
{% if has_change_permission and has_add_permission %}
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
{% endif %}
Esto está lejos de ser limpio y aún permite al usuario cambiar los datos si se ofrecen otras formas además del formulario de administrador estándar, pero tal vez sea suficiente, si solo quiere proteger al personal de cambios accidentales de datos, no deberían hacerlo.
Una solución alternativa sería tener un permiso adicional de "guardar" en su modelo y verificar el método save_model de save_model
si el usuario tiene estos permisos, si no los tiene, eso significaría que puede hacer todo en este modo de modelado, ¡excepto guardar los datos editados!