tutorial startapp sqlmigrate setup manage createsuperuser python django django-admin

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



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!