web-dev-qa-db-fra.com

Comment créer une page personnalisée pour l'administrateur Django?

Je veux créer une page personnalisée pour le panneau d'administration sans modèle. Pour la première fois, je copie index.html dans le dossier du projet:

mysite/
    templates/
        admin/
            index.html

Puis ajouter aux applications bloquer mon code:

<div class="module">
    <table summary="{% blocktrans with name="preferences" %}Models available in the preferences application.{% endblocktrans %}">
        <caption><a href="preferences" class="section">{% blocktrans with name="preferences" %}Preferences{% endblocktrans %}</a></caption>
            <tr>
                <th scope="row"><a href="preferences">Preferences</a></th>
                <td><a href="preferences" class="changelink">{% trans 'Change' %}</a></td>
            </tr>
    </table>
</div>

Cela fonctionne bien, alors je crée une nouvelle page /templates/admin/preferences/preferences.html et Add to urls.py:

url(r'^admin/preferences/$', TemplateView.as_view(template_name='admin/preferences/preferences.html')),

Et ajoutez du code à preferences.html:

{% extends "admin/base_site.html" %}
{% block title %}Test page{% endblock %}

Lancez-le et voyez le message d'erreur «La page d'administration demandée n'existe pas». Ce que je fais mal?

31
Gr1N

Vous devez ajouter votre URL d'administrateur avant les modèles d'URL de l'administrateur lui-même:

urlpatterns = patterns('',
   url(r'^admin/preferences/$', TemplateView.as_view(template_name='admin/preferences/preferences.html')),
   url(r'^admin/', include('Django.contrib.admin.urls')),
)

De cette façon, l'URL ne sera pas traitée par l'administrateur de Django.

28
Simeon Visser

Vous devriez utiliser admin get_urls .

11
Mitar

Voici un exemple de tout ce qui devrait être nécessaire (à partir de Django 1.6) pour une page d’administration personnalisée qui est liée à partir d’un bouton situé à côté du bouton "Historique" en haut à droite de la page de détail d’un objet:

https://Gist.github.com/mattlong/4b64212e096766e058b7

5
mateolargo

Les années passent et une réponse pertinente à cette question peut être postée.

En utilisant Django 1.10+, vous pouvez faire:

security/admin.py (il s'agit du fichier d'administration de votre application)

from Django.contrib import admin
from Django.conf.urls import url
from Django.template.response import TemplateResponse
from security.models import Security


@admin.register(Security)
class SecurityAdmin(admin.ModelAdmin):

    def get_urls(self):

        # get the default urls
        urls = super(SecurityAdmin, self).get_urls()

        # define security urls
        security_urls = [
            url(r'^configuration/$', self.admin_site.admin_view(self.security_configuration))
            # Add here more urls if you want following same logic
        ]

        # Make sure here you place your added urls first than the admin default urls
        return security_urls + urls

    # Your view definition fn
    def security_configuration(self, request):
        context = dict(
            self.admin_site.each_context(request), # Include common variables for rendering the admin template.
            something="test",
        )
        return TemplateResponse(request, "configuration.html", context)

security/templates/configuration.html

{% extends "admin/base_site.html" %}
{% block content %}
...
{% endblock %}

Voir Description officielle de ModelAdmin.get_urls (assurez-vous de bien choisir la version de Django, ce code est valide pour 1.10 ci-dessus)

5
Rui Carvalho

Exemple complet:

from Django.conf.urls import url
from Django.contrib import admin
from Django.db import models

class DummyModel(models.Model):
    class Meta:
        verbose_name = 'Link to my shiny custom view'
        app_label = 'users'  # or another app to put your custom view

@admin.register(DummyModel)
class DummyModelAdmin(admin.ModelAdmin):
    def get_urls(self):
        view_name = '{}_{}_changelist'.format(
                DummyModel._meta.app_label, DummyModel._meta.model_name)
        return [
            url(r'^my_view/$', MyCustomView.as_view(), name=view_name)
        ]
1
Mark Mishyn