Mémo inversé de l'écran de gestion Django

Écran de liste (Modifier l'affichage de la liste)

Spécifiez l'élément à afficher

ModelAdmin.list_display = ('hoge',)

Les méthodes personnalisées pour les modèles qui retournent Bool peuvent être spécifiées directement. Vous pouvez également spécifier «unicode» ou «str».

ModelAdmin.list_display = ('__str__', 'model_custom_method')

Spécifiez l'élément pour mettre le lien vers l'écran de détail

Par défaut, celui affiché à l'extrême gauche a un lien

ModelAdmin.list_display = ('hoge', 'fuga')
ModelAdmin.list_display_links = ('fuga',)

Afficher les valeurs personnalisées

ModelAdmin.list_display = ('custom_hoge',)

def custom_hoge(self, obj):
    return u'Hoge'
custom_hoge.short_description = u'Afficher un nom'
custom_hoge.allow_tags = True  #autorisation de balise html

Pour les entrées utilisateur, il est recommandé de s'échapper en utilisant la fonction format_html ('hoge').

Ordre de tri par défaut

ModelAdmin.ordering = ('created_at',)  #Trier par heure de création

Action personnalisée (celle de la partie de sélection en haut de la vue de liste)

ModelAdmin.actions = ['hoge']  #Liste des fonctions définies, etc.
ModelAdmin.actions_on_top = True  #Affiché en haut de la page
ModelAdmin.actions_on_bottom = True  #Affiché en bas de page

Trier les champs personnalisés

Etant donné que tout le tri Django est effectué au niveau de la requête de la base de données, les champs qui n'ont pas réellement de colonnes dans la base de données ne peuvent pas être triés. Cependant, lorsqu'un champ personnalisé remplace un certain champ, vous pouvez le trier en spécifiant le nom du champ.

ModelAdmin.list_display = ('number_str',)

#nombre est un nombre(int)Rendre
def number_str(self, obj):
    return str(obj.number)
number_str.admin_order_field = 'number'

Comment rendre un champ personnalisé sans colonnes dans la base de données triable avec list_display

StackOverflow Django admin: how to sort by one of the custom list_display fields that has no database field

Écran d'ajout / de modification

Je souhaite mettre à jour un champ spécifique

Il existe deux méthodes de spécification

fields

  1. Les champs peuvent également spécifier la valeur de ModelAdmin.readonly_fields, mais ne peuvent pas être modifiés
  2. Contrairement à list_display etc., vous ne pouvez spécifier que le champ Model ou ModelAdmin.form
ModelAdmin.fields = ('hoge', 'fuga')  # hoge,Seul le champ fuga est ajouté et modifié lors de la mise à jour
ModelAdmin.fields = (('hoge', 'fuga'), 'piyo')  # hoge,fuga s'affiche sur la même ligne

exclude

ModelAdmin.exclude = ('hoge',)  #hoge n'est pas modifiable

Des valeurs de clé externes peuvent également être ajoutées / modifiées sur le même écran

#Définir le modèle en ligne
class SomeForeignKeyModelInline(admin.TabularInline):
    model = SomeForeignKeyModel

#Ajouter à l'écran de gestion du modèle dont vous souhaitez afficher le modèle Inline
class HogeAdmin(admin.ModelAdmin):
    list_display = ('hoge', 'fuga')
    inlines = [SomeForeignKeyModelInline]

Écran riche avec option de jeux de champs

ModelAdmin.fieldsets = (
    ( 'Nom', {'Nom de l'option': ('Valeur d'option',)} ),
    (None, {
        'fields': ('hoge', 'fuga')
    }),
)

Formulaire personnalisé

Par défaut, ModelForm générera un formulaire pour l'écran de gestion, mais vous pouvez également spécifier votre propre formulaire personnalisé.

ModelAdmin.form = HogeForm

Je souhaite afficher les champs de formulaire personnalisés qui ne sont pas définis dans le modèle sur l'écran de gestion

stackOverflow: django admin - add custom form fields that are not part of the model

Je souhaite personnaliser un formulaire existant automatiquement généré

Hook avec la méthode get_form

ModelAdmin.get_form(request, obj=None, **kwargs)

Modèle d'écran de gestion d'écrasement

Réglage

Le modèle original de l'écran de gestion est stocké dans contrib / admin / template / admin. Pour écraser, ajoutez ʻadmin / dans le répertoire défini par TEMPLATE_DIR`.

Ajoutez la cible de gestion que vous souhaitez écraser sous le répertoire ci-dessus avec ʻapp_name / modelname / `. Le modèle sous le nom de l'application est appliqué à tous les modèles sous l'application. Les modèles sous le nom du modèle sont appliqués uniquement à l'écran de gestion de ce modèle. Tous les noms de répertoires sont en minuscules.

Politique de création de modèle

Fondamentalement, il est plus efficace d'écraser uniquement les pièces nécessaires.

Exemple: Si vous souhaitez écraser l'écran de la liste des modèles fuga de l'application hoge ʻCreate admin / hoge / fuga / change_list.html`.

Après cela, écrasez le {% block%} que vous souhaitez modifier comme suit.

{% extend 'admin/change_list.html' %}
{% block 'content' %}
<!--
Formulaires et variables que vous souhaitez ajouter
-->
{{ block.super }}
{% endblock 'content' %}

Ajout de fonctions originales

Si vous souhaitez ajouter votre propre fonction à l'écran de gestion, un mémo du travail éventuellement nécessaire

Ajouter l'URL

Ajoutez une URL qui fournit vos propres fonctionnalités. Vous devez personnaliser l'URL que l'écran d'administration de Django génère par défaut.

Utilisez get_urls.

from django.conf.urls import url
from django.http import HttpResponse
class HogeAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(HogeAdmin, self).get_urls()
        my_urls = [
            url(r'^hoge/$', self.admin_site.admin_view(self.hoge), name='hoge'),
        ]
        return my_urls + urls

    def hoge(self, request):
        return HttpResponse('OK')

self.admin_site.admin_view donne la vérification des permissions et never_cache à la vue que vous voulez ajouter. En gros, il vaut mieux l'envelopper avec ça.

Notez l'ordre de return my_url + urls. Si vous ne mettez pas my_urls en premier, l'URL standard de l'écran de gestion sera priorisée. Je ne peux pas accéder à la vue de ma propre URL définie.

Écraser le fonctionnement de l'écran de gestion existant

Remplacer le comportement de chaque fonction d'affichage

class HogeAdmin(admin.ModelAdmin):
    #Exemple d'écrasement de l'opération de l'écran de liste
    def changelist_view(self, request, extra_context=None):
        extra_context = extra_context or {}
        extra_context['hoge'] = 'hoge'
        return super(HogeAdmin, self).changelist_view(request, extra_context=extra_context)

Autre

Gérer le même modèle avec plusieurs ModelAdmins

StackOverflow Multiple ModelAdmins/views for same model in Django admin

Recommended Posts

Mémo inversé de l'écran de gestion Django
Mémo inversé Pandas
Personnalisation de list_filter de l'écran d'administration de Django
Personnalisation de l'écran d'administration de Django Première étape
Pytest à traction inversée
Mémo d'apprentissage Django
mémo du didacticiel django
Développement d'une application WEB avec Django [Création de l'écran d'administration]
DJango Memo: depuis le début (réglage de l'écran d'erreur)
mémo de déploiement heroku (Django)
Référence inversée Sympy
Flux d'ajout d'écran Django2
Django memo n ° 1 à partir de zéro
Référence inversée Luigi
[Memo] Environnement de développement Django
DJango Memo: depuis le début (plus de modifications sur l'écran de gestion)
Lorsque vous oubliez le nom d'utilisateur et le mot de passe de l'écran de gestion dans Django
Mémo de construction de l'environnement de développement Django
Réglage du site d'administration de Django
Conseils de configuration du serveur Pull inversé
Mon mémo numpy / scipy inversé
Créer un écran de connexion Django
[Mémo d'apprentissage] Résumé de la commande Django
Mémo DJango: Depuis le début (en utilisant l'écran de gestion) mon point addictif
L'histoire de l'échec de la mise à jour de "calendar.day_abbr" sur l'écran d'administration de django