Maison >développement back-end >Tutoriel Python >Djangoadminsite(一)ModelAdminOptions
L’interface de gestion Admin est l’application phare de Django. Il lit les métadonnées de votre schéma et vous fournit ensuite une interface puissante et utilisable que les administrateurs de sites Web peuvent utiliser pour ajouter instantanément du contenu au site Web.
Pour utiliser admin, vous pouvez suivre les étapes ci-dessous :
Ajoutez 'django.contrib.admin' à la configuration du paramètre INSTALLED_APPS.
Assurez-vous que INSTALLED_APPS contient 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.messages' et 'django.contrib.sessions.', l'administrateur de Django a besoin de ces 4 sacs.
Ajoutez 'django.contrib.messages.context_PRocessors.messages' à TEMPLATE_CONTEXT_PROCESSORS et assurez-vous que MIDDLEWARE_CLASSES contient 'django.contrib.auth.middleware.AuthenticationMiddleware' et 'django.contrib.messages.middleware.MessageMiddleware' . (Ajouté par défaut)
Déterminez quels modèles doivent être appliqués à l'administrateur.
Créez un ModelAdmin dans admin.py dans chaque application nécessitant un administrateur.
Enregistrer le modèle et ModelAdmin
depuis django.contrib import admin
depuis myproject.myapp.models import Author
class AuthorAdmin(admin.ModelAdmin):
pass
admin.site.register(Author, AuthorAdmin)
Configurer l'accès administrateur dans URLconf
à partir de django.contrib import admin
admin.autodiscover()
# Et incluez ce modèle d'URL...
urlpatterns = patterns('',
# ...
(r'^admin/', include(admin.site.urls) ),
# ...
)
Exécutez python manage.py migrate pour vous rappeler de créer un superutilisateur et vous pourrez accéder à http://127.0.0.1:8000/admin/.
Objet ModelAdmin
register decorator
register(*models[, site=django.admin.sites.site])
Nouvellement ajouté dans la version 1.7. Model et ModelAdmin peuvent être enregistrés comme ceci :
from django.contrib import admin
from .models import Author
@admin.register(Author)
class AuthorAdmin(admin. ModelAdmin) :
pass
Vous pouvez enregistrer plusieurs modèles à la fois et vous pouvez utiliser votre propre AdminSite personnalisé :
depuis django.contrib import admin
depuis .models import Auteur, Lecteur, Éditeur
depuis myproject.admin_site import custom_admin_site
@admin.register(Auteur, Lecteur, Éditeur, site=custom_admin_site)
class PersonAdmin(admin.ModelAdmin) :
pass
Comment fonctionne l'administrateur
Lorsque 'django.contrib.admin' est ajouté à INSTALLED_APPS, django trouvera automatiquement le module admin.py dans chaque application et l'importera.
class apps.AdminConfig
Django 1.7 nouveau.
La classe AppConfig par défaut de l'administrateur Autodiscover() sera exécutée au démarrage de Django.
class apps.SimpleAdminConfig
Nouveau dans Django 1.7.
Similaire à AdminConfig, il n'exécutera pas autodiscover().
autodiscover()
importer l'administrateur de chaque module d'application .py.
Modifications de Django 1.7 :
Dans les versions précédentes, vous deviez démarrer manuellement cette méthode dans urls.py pour trouver l'admin.py de chaque application. Après la 1.7, AdminConfig exécutera automatiquement cette méthode.
Si vous utilisez un AdminSite personnalisé, vous devez charger les sous-classes de ModelAdmin dans votre propre code et les enregistrer toutes dans l'AdminSite personnalisé. Dans ce cas, vous devez arrêter la découverte automatique () et vous pouvez remplacer « django.contrib.admin » dans INSTALLED_APPS par « django.contrib.admin.apps.SimpleAdminConfig ».
Options ModelAdmin
actions
Liste des actions d'administration
actions_on_top
actions_on_bottom
L'emplacement de l'action.
date_hierarchy
Définissez date_hierarchy sur DateField ou DateTimeField du modèle pour ajouter une hiérarchie de dates à ce modèle dans l'administrateur.
fields
exclude
détermine quels champs sont affichés dans le formulaire du modèle. les champs incluent, excluent exclus.
de django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
fields = ('name', 'title')
class AuthorAdmin(admin .ModelAdmin):
exclus = ('birth_date',)
Vous pouvez mettre certains champs sur la même ligne, comme les champs d'URL et de titre suivants sur la même ligne :
class FlatPageAdmin(admin.ModelAdmin):
fields = (('url', 'title'), 'content')
fieldsets
fieldsets est un double tuple ( name, field_options), les champs peuvent être divisés en blocs :
from django.contrib import admin
class FlatPageAdmin(admin.ModelAdmin):
fieldsets = (
(Aucun) , {
',), 'champs' : ('enable_comments', 'registration_required', 'template_name')
}),
)
name est le titre du bloc et field_options est un dictionnaire. Les clés de
field_options sont les suivantes :
fields
Un tuple de noms de champs, affichés dans l'ensemble de champs
{
'fields' : (('first_name', 'last_name'), 'address', 'city', 'state'),
}
classes
Extra fourni à la liste des champs de classes CSS.
description
Texte supplémentaire pouvant être affiché en haut de l'ensemble de champs.
filter_horizontal
filter_vertical
Lorsque le modèle a un champ ManyToManyField, utilisez filter_horizontal, et filter_vertical peut être sélectionné parmi les options existantes. L’un est horizontal et l’autre vertical.
formulaire
Le formulaire utilisé.
à partir des formulaires d'importation Django
à partir de Django.contrib import admin
à partir de myapp.models import Person
class PersonForm(forms.ModelForm):
class Meta :
modèle = Personne
exclure = ['nom']
class PersonAdmin(admin.ModelAdmin):
exclure = ['âge']
formulaire = PersonneForm
Lorsqu'un conflit survient, ModelAdmin a la priorité. Dans l'exemple ci-dessus, l'âge sera exclu, mais le nom sera affiché sur la page.
formfield_overrides
Vous pouvez remplacer les options de certains champs dans l'interface du formulaire modèle et ajouter vos propres composants personnalisés pour certains types de champs spécifiques
Par exemple, vous souhaitez ajoutez le champ TextField de votre propre modèle Utilisez un éditeur de texte enrichi :
depuis django.db import models
depuis django.contrib import admin
# Importez notre widget personnalisé et notre modèle d'où ils 'sont définis
depuis myapp.widgets import RichTextEditorWidget
from myapp.models import MyModel
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField : {' widget' : RichTextEditorWidget},
}
list_display
Champs pouvant être affichés sur la page de liste des modifications du modèle. Si list_display n'est pas défini, l'interface d'administration s'affichera automatiquement. les résultats __unicode__() du modèle.
Il y a 4 valeurs dans list_display :
Un champ de modèle
list_display = ('first_name', 'last_name')
Une fonction appelable avec le modèle comme paramètre
def upper_case_name(obj):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
upper_case_name .short_description = 'Name'
class PersonAdmin(admin.ModelAdmin):
list_display = (upper_case_name,)
Un attribut de ModelAdmin, similaire à une fonction appelable
class PersonAdmin(admin.ModelAdmin):
list_display = ('upper_case_name',)
def upper_case_name(self, obj):
return ("%s %s" % ( obj.first_name, obj.last_name)).upper()
upper_case_name.short_description = 'Name'
Un attribut de Model, similaire à la fonction appelable
de Django .db importer des modèles
de django.contrib import admin
class Person(models.Model):
nom = models.CharField(max_length=50)
anniversaire = models.DateField( )
def décennie_born_in(self):
return self.birthday.strftime('%Y')(:3] "0's"
décennie_born_in.short_description = 'Décade de naissance'
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'decade_born_in')
Remarque :
Si le champ est ForeignKey, la clé étrangère sera être affiché __unicode__.
ManyToManyField n'est pas pris en charge
S'il s'agit d'un BooleanField, on ou off sera affiché.
Si la chaîne fournie est une méthode de Model ou ModelAdmin ou une fonction appelable, Django échappera automatiquement la sortie HTML. Si vous ne souhaitez pas vous échapper, vous pouvez définir les allow_tags de la méthode sur True. Afin d'éviter les attaques cross-site XSS, vous devez utiliser format_html pour échapper à la saisie de l'utilisateur :
depuis django.db import models
depuis django.contrib import admin
depuis django.utils.html import format_html
class Person(models.Model):
first_name = models. CharField(max_length=50)
last_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def colour_name(self):
return format_html( '{1} {2}',
self.last_name )
coloured _name.allow_tags = True
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'colored_name')
Si la chaîne fournie est une méthode de modèle ou ModelAdmin ou une fonction appelable et renvoie True ou False, vous pouvez définir l'attribut booléen de la méthode sur True. De cette façon, l'icône d'activation ou de désactivation sera affichée sur la page.
depuis django.db import models
depuis django.contrib import admin
class Person(models.Model):
first_name = models.CharField(max_length=50)
anniversaire = models.DateField()
def born_in_fifties(self):
return self.birthday.strftime('%Y')[:3] == '195'
born_in_fifties.boolean = True
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'born_in_fifties')
La méthode __str__ ou __unicode__ du modèle est également Vous pouvez utiliser
list_display = ('__str__', 'some_other_field')
Si les éléments de list_display ne sont pas des champs réels de la base de données, vous ne pouvez pas trier selon cet élément. Sinon, vous pouvez commander par cet article et vous pouvez l'indiquer en définissant l'attribut admin_order_field.
depuis django.db import models
depuis django.contrib import admindepuis django.utils.html import format_html
class Person(models.Model):
first_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def coloured_first_name(self):
return format_html('{1}',
_tags = True
coloré _first_name.admin_order_field = 'first_name'
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'colored_first_name')
Lorsque vous essayez de trier par coloured_first_name, Django triera par first_name Tri. Peut être trié à l'envers :
colored_first_name.admin_order_field = '-first_name'
Les éléments de list_display peuvent également être des attributs :
class Person(object):
first_name = models.CharField(max_length=50)
return self.first_name ' ' self.last_name
my_property.short_description = "Nom complet de la personne"
full_name = property(my_property)
class PersonAdmin(admin.ModelAdmin):
list_display = ('full_name',)
list_display_link
Les champs seront liés à la page de changement de mode
list_display = ('first_name' , 'last_name', 'birthday')
list_display_links = ('first_name', 'last_name')list_editable
Les champs peuvent être modifiés sur la page de liste de modifications de. Les champs qu'il contient doivent également être dans list_display.
list_filter = ('company__name',)
list_max_show_all
afficher tout Le nombre de modèles sur la page , il manque Save 200.
Utilisez le bouton radio au lieu de la case de sélection (ForeignKey ou lorsqu'il y a une option de choix).
class PersonAdmin(admin.ModelAdmin):
radio_fields = {"group": admin.VERTICAL}
raw_id_fields
affichera les identifiants des field , utilisé pour ForeignKey ou ManyToManyField.
class ArticleAdmin(admin.ModelAdmin):
raw_id_fields = ("newspaper")
readonly_fields
Uniquement les champs lisibles et non modifiables. Il peut également s'agir d'une méthode :
from django.contrib import admin
from django.utils.html import format_html_join
from django.utils.safestring import mark_safe
class PersonAdmin( admin. ModelAdmin):
readonly_fields = ('address_report',)
def address_report(self, instance):
# en supposant que get_full_address() renvoie une liste de chaînes
# pour chaque ligne de l'adresse et que vous souhaitez séparer chaque
# ligne par un saut de ligne
return format_html_join(
mark_safe('
'),
((( ligne,) pour la ligne entrante instance.get_full_address()),
) ou "Je ne parviens pas à déterminer cette adresse."
# short_description fonctionne comme un champ de modèle verbose_name
address_report.short_description = "Address"
# dans cet exemple, nous avons utilisé des balises HTML dans la sortie
address_report.allow_tags = True
Le modèle utilisé par add_view().
Le modèle utilisé par change_view().
Le modèle utilisé par changelist_view() .
Le modèle utilisé par delete_view().
Le modèle utilisé par la méthode d'action delete_selected.
Modèle et journal utilisés par history_view().