examples english documentacion docs actions django django-admin

english - Administrador de Django, esconde un modelo



docs django project (8)

A partir de Django 1.8.18 , has_module_permission() todavía tiene problema. Entonces, en nuestro caso usamos también get_model_perms() . Del mismo modo, tenemos que ocultar el modelo solo para usuarios específicos, pero el superuser debe poder acceder a su entrada de índice.

class MyModelAdmin(admin.ModelAdmin): def get_model_perms(self, request): if not request.user.is_superuser: return {} return super(MyModelAdmin, self).get_model_perms(request) admin.site.register(MyModel, MyModelAdmin)

En la página raíz del sitio de administración donde aparecen los modelos registrados, quiero ocultar varios modelos que están registrados en el administrador de Django.

Si elimino el registro directamente de ellos, no puedo agregar nuevos registros a medida que el símbolo agregar nuevo "+" desaparece.

¿Cómo puede hacerse esto?


Desde Django 1.8, ModelAdmin tiene un nuevo método llamado has_module_permission() que es responsable de mostrar un modelo en el índice de administración.

Para ocultar un modelo del índice de administración, solo cree este método en su clase ModelAdmin y devuelva False . Ejemplo:

class MyModelAdmin(admin.ModelAdmin): ... def has_module_permission(self, request): return False


Django 1.2 tiene nuevas sentencias if, lo que significa que la característica deseada podría obtenerse solo sobrescribiendo admin / index.html

{% if model.name not in "Name of hidden model; Name of other hidden model" %} ... {% endif %}

Esta es una mala solución, ya que no le importan los administradores de varios idiomas. Por supuesto, puede agregar los nombres de los modelos en todos los idiomas admitidos. Es una buena solución porque no sobrescribe más de un aspecto de las funciones básicas de Django.

Pero antes de cambiar cualquier cosa, creo que la gente debería pensar en esto ...

Básicamente, el problema está relacionado con tener modelos que uno no desea usar para más que agregar una opción a un menú desplegable de vez en cuando. Podría resolverse creando un conjunto de permisos para usuarios "no tan avanzados" que entran en pánico cuando hay demasiados modelos. En caso de que se requieran cambios en los modelos en particular, uno simplemente puede iniciar sesión con la "cuenta avanzada".


Esta es una construcción alternativa en la parte superior de la respuesta de x0nix, y solo si está contento ocultando las filas con jquery.

Copiar pegando de la otra respuesta la parte que reutilicé

class HiddenModelAdmin(admin.ModelAdmin): def get_model_perms(self, *args, **kwargs): perms = admin.ModelAdmin.get_model_perms(self, *args, **kwargs) perms[''list_hide''] = True return perms class MyModelAdmin(HiddenModelAdmin): ... admin.site.register(MyModel, MyModelAdmin)

Luego, instale django-jquery y luego agregue el siguiente bloque en su plantilla /admin/index.html :

{% extends "admin:admin/index.html" %} {% block extrahead %} <script type="text/javascript" src="{{ STATIC_URL }}js/jquery.js"></script> {% if app_list %} <script type="text/javascript"> $(function(){ {% for app in app_list %} {% for model in app.models %} {% if model.perms.list_hide %} $(''div.app-{{ app.app_label }}'').find(''tr.model-{{ model.object_name|lower }}'').hide(); {% endif %} {% endfor %} {% endfor %} }); </script> {% endif %} {% endblock %}

No es necesario que copie y pegue toda la plantilla, solo extiéndala y anule el bloque extrahead . Necesitará django-apptemplates para que lo anterior funcione.


Solución fea: override plantilla de índice de administrador, es decir, copie index.html de django a su /admin/index.html y agregue algo como esto:

{% for for model in app.models %} {% ifnotequal model.name "NameOfModelToHide" %} ...


Tenía muchos administradores de modelos para registrar y ocultar, si quieres una solución más DRY, esto funcionó para mí (Django 1.10, Python 3.5)

# admin.py def register_hidden_models(*model_names): for m in model_names: ma = type( str(m)+''Admin'', (admin.ModelAdmin,), { ''get_model_perms'': lambda self, request: {} }) admin.site.register(m, ma) register_hidden_models(MyModel1, MyModel2, MyModel3)

Supongo que podrías incluirlo en una clase de utilidad si deseas volver a usarlo en todas las aplicaciones.


Tengo el mismo problema, aquí lo que se me ocurrió.

Al igual que en la solución anterior, copie index.html de django a su /admin/index.html y modifíquelo de esta manera:

{% for model in app.models %} {% if not model.perms.list_hide %} <tr> ... </tr> {% endif %} {% endfor %}

Y crea la subclase ModelAdmin:

class HiddenModelAdmin(admin.ModelAdmin): def get_model_perms(self, *args, **kwargs): perms = admin.ModelAdmin.get_model_perms(self, *args, **kwargs) perms[''list_hide''] = True return perms

Ahora cualquier modelo registrado con la subclase HiddenModelAdmin no aparecerá en la lista de administración, pero estará disponible en el símbolo "más" en detalle:

class MyModelAdmin(HiddenModelAdmin): ... admin.site.register(MyModel, MyModelAdmin)


Basado en la respuesta de x0nix hice algunos experimentos. Parece que devolver un dict vacío de get_model_perms excluye el modelo de index.html, al mismo tiempo que le permite editar instancias directamente.

class MyModelAdmin(admin.ModelAdmin): def get_model_perms(self, request): """ Return empty perms dict thus hiding the model from admin index. """ return {} admin.site.register(MyModel, MyModelAdmin)