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?
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.
Vous devriez utiliser admin get_urls .
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:
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)
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)
]