urls tutorial modelos metodos index girls facil empezar despliega desplegar con como django django-admin

tutorial - ¿Cómo puedo agregar un botón en la página de vista de lista de cambios de administrador de django?



tutorial django (2)

Me gustaría agregar un botón al lado del botón "agregar" en la vista de lista en el modelo para mi modelo y luego crear una función de vista donde haré mis cosas y luego redirigir al usuario a la vista de lista.

He comprobado cómo sobrecargar la plantilla de administración, pero aún no lo sé, ¿dónde debería poner mi función de vista donde haré mis cosas y cómo puedo registrar esa vista en las URL de administrador?

También hay preguntas sobre la seguridad. Me gustaría tener esa acción dentro de admin, así que si no está registrado, no puede usarlo.

He encontrado esto, pero no sé si es la forma correcta: http://www.stavros.io/posts/how-to-extend-the-django-admin-site-with-custom/


Cuando varias aplicaciones proporcionan versiones diferentes del mismo recurso (plantilla, archivo estático, comando de administración, traducción), la aplicación que aparece primero en INSTALLED_APPS tiene prioridad. - Documentación de Django en INSTALLED_APPS.

Asegúrese de que su aplicación ''django.contrib.admin'' en la lista antes de ''django.contrib.admin'' en INSTALLED_APPS .

Cree una plantilla change_list.html en uno de los siguientes directorios:

# Template applies to all change lists. myproject/myapp/templates/admin/change_list.html # Template applies to change lists in myapp. myproject/myapp/templates/admin/myapp/change_list.html # Template applies to change list in myapp and only to the Foo model. myproject/myapp/templates/admin/myapp/foo/change_list.html

La plantilla debe recogerse automáticamente, pero en caso de que no se encuentre en una de las rutas mencionadas anteriormente, también puede señalarla mediante un atributo de modelo de administrador:

class MyModelAdmin(admin.ModelAdmin): #... change_list_template = "path/to/change_list.html"

Puede buscar el contenido del change_list.html original que se encuentra en la path/to/your/site-packages/django/contrib/admin/templates/admin/change_list.html . La otra respuesta también muestra cómo formatear la plantilla. Nikolai Saiko le muestra cómo anular las partes relevantes usando ''extiende'' y ''super''. Resumen:

{% extends "admin/change_list.html" %} {% load i18n %} {% block object-tools-items %} {{ block.super }} <li> <a class="historylink" href="...">My custom admin page</a> </li> {% endblock %}

Rellenemos href="..." con una url. Los nombres de la URL del administrador están en el espacio de nombres ''admin'' y se pueden buscar así:

{% url ''admin:custom_view'' %}

Cuando está agregando un botón a change_form.html, tal vez quiera pasar la identificación del objeto actual:

{% url ''admin:custom_view'' original.pk %}

Ahora crea una vista personalizada. Esta puede ser una vista normal (al igual que otras páginas de su sitio web) o una vista de administrador personalizada en admin.py. El método get_urls en un ModelAdmin devuelve las URL que se usarán para ese ModelAdmin de la misma manera que un URLconf. Por lo tanto, puede ampliarlos como se documenta en el distribuidor de URL:

class MyModelAdmin(admin.ModelAdmin): def get_urls(self): urls = super(MyModelAdmin, self).get_urls() my_urls = patterns('''', url(r''^my_view/$'', self.my_view, name="custom_view") ) return my_urls + urls def my_view(self, request): # custom view which should return an HttpResponse pass # In case your template resides in a non-standard location change_list_template = "path/to/change_list.html"

Lea los documentos sobre cómo establecer permisos en una vista en ModelAdmin: https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_urls

Puede proteger su vista y solo dar acceso a usuarios con estatus de personal:

from django.contrib.admin.views.decorators import staff_member_required @staff_member_required def my_view(request): ...

Es posible que también desee verificar request.user.is_active y manejar usuarios inactivos.

Actualización: aproveche el marco y personalice lo menos posible. Muchas veces, las acciones pueden ser una buena alternativa: https://docs.djangoproject.com/en/1.5/ref/contrib/admin/actions/

Actualización 2: eliminé un ejemplo de JS para inyectar un lado del botón del cliente. Si lo necesitas, consulta las revisiones .


Aquí hay otra solución , sin usar jQuery (como una proporcionada por allcaps). También esta solución proporciona el pk del objeto de una manera más intuitiva :)

Daré mi código fuente basado en ese enlace (siga el enlace de arriba para más información):

Tengo una aplicación de productos con modelo de producto. Este código agrega el botón "Hacer el mal", que ejecuta ProductAdmin.do_evil_view ()

Archivo productos / modelos.py :

class ProductAdmin(admin.ModelAdmin): def get_urls(self): urls = super().get_urls() my_urls = patterns('''', (r''^(?P<pk>/d+)/evilUrl/$'', self.admin_site.admin_view(self.do_evil_view)) ) return my_urls + urls def do_evil_view(self, request, pk): print(''doing evil with'', Product.objects.get(pk=int(pk))) return redirect(''/admin/products/product/%s/'' % pk)

self.admin_site.admin_view es necesario para garantizar que el usuario haya iniciado sesión como administrador.

Y esta es la extensión de plantilla de la página de administración estándar de Django para cambiar la entrada:
Archivo: {template_dir} /admin/products/product/change_form.html

En Django> = 1.8 (gracias a @jenniwren por esta información):

{% extends "admin/change_form.html" %} {% load i18n %} {% block object-tools-items %} {{ block.super }} <li><a class="historylink" href="evilUrl/">{% trans "Do Evil" %}</a></li> {% endblock %}

Si su versión de Django es menor que 1.8 , tiene que escribir un código más:

{% extends "admin/change_form.html" %} {% load i18n %} {% block object-tools %} {% if change %}{% if not is_popup %} <ul class="object-tools"> <li><a class="historylink" href="history/">{% trans "History" %}</a></li> <li><a class="historylink" href="evilUrl/">{% trans "Do Evil" %}</a></li> {% if has_absolute_url %} <li><a class="viewsitelink" href="../../../r/{{ content_type_id }}/{{ object_id }}/">{% trans "View on site" %}</a></li> {% endif%}</ul> {% endif %}{% endif %} {% endblock %}