48 votes

Ajout d'un texte d'aide à l'échelle du modèle au formulaire d'administration d'un modèle django

Dans mon application django, j'aimerais pouvoir ajouter un texte d'aide personnalisé au formulaire de modification de l'administrateur pour certains de mes modèles. Notez que je ne parle pas de l'aide spécifique au champ help_text que je peux définir pour chaque champ. Par exemple, en haut du formulaire de modification de My_Model en My_App J'aimerais pouvoir ajouter du HTML qui dise "Pour des informations supplémentaires sur Mon modèle, voir http://example.com "afin de fournir un lien vers un wiki de documentation interne.

Existe-t-il un moyen simple d'y parvenir, ou dois-je créer un formulaire d'administration personnalisé pour le modèle ? Si c'est le cas, pouvez-vous me donner un exemple de la façon dont je pourrais le faire ?

72voto

Mike DeSimone Points 20059

Utilisez l'adresse de l'administrateur fieldsets :

class MyAdmin(admin.ModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('first', 'second', 'etc'),
            'description': "This is a set of fields group into a fieldset."
        }),
    )
    # Other admin settings go here...

Vous pouvez avoir plusieurs jeux de champs dans un admin. Chacun peut avoir son propre titre (remplacez le None ci-dessus avec le titre). Vous pouvez également ajouter 'classes': ('collapse',), à un jeu de champs pour qu'il commence par être réduit (l'option wide rend les champs de données plus larges, et les autres noms de classe ont la signification que leur attribue votre CSS).

Attention : le description est considérée comme sûr donc ne mettez pas de données non nettoyées. Ceci est fait pour que vous puissiez y mettre du balisage si nécessaire (comme votre lien), cependant, le formatage de bloc (comme <ul> ) aura probablement l'air faux.

1 votes

À mon avis, cela dépend de l'acceptabilité des jeux de champs pour votre application. Si c'est le cas, utilisez ma réponse, sinon, utilisez celle d'André.

35voto

André Terra Points 711

Il existe un moyen assez simple, mais peu documenté, d'y parvenir.

Définir render_change_form dans la classe Admin

Tout d'abord, vous devez transmettre un contexte supplémentaire à votre administrateur. Pour ce faire, vous pouvez définir une fonction render_change_form dans votre classe d'administration, par exemple :

# admin.py
class CustomAdmin(admin.ModelAdmin):
    def render_change_form(self, request, context, *args, **kwargs):
        # here we define a custom template
        self.change_form_template = 'admin/myapp/change_form_help_text.html'
        extra = {
            'help_text': "This is a help message. Good luck filling out the form."
        }

        context.update(extra)
        return super(CustomAdmin, self).render_change_form(request,
            context, *args, **kwargs)

Création d'un modèle personnalisé

Ensuite, vous devez créer ce modèle personnalisé (change_form_help_text.html) et étendre le modèle par défaut 'admin/change_form.html'.

# change_form_help_text.html
{% extends 'admin/change_form.html' %}
{% block form_top %} 
{% if help_text %}<p>{{ help_text }}</p>{% endif %}
{% endblock %}

J'ai choisi de placer ce modèle à l'intérieur de templates/admin/myapp/, mais cela est également flexible.


Plus d'informations disponibles sur le site :

http://davidmburke.com/2010/05/24/django-hack-adding-extra-data-to-admin-interface/

http://code.djangoproject.com/wiki/NewformsHOWTO#Q:HowcanIpassextracontextvariablesintomyaddandchangeviews

3 votes

Je pense que "sous-documenté" est généreux. Bien vu.

2voto

Bernhard Vallant Points 18035

1 votes

J'étais en train de l'écrire aussi, mais ça a vite dégénéré. Le problème n'est pas de remplacer les modèles d'administration, mais d'obtenir les informations supplémentaires par modèle depuis le modèle vers le modèle, ce qui semble devoir être fait en remplaçant le modèle d'administration par le modèle d'administration. voir ou utiliser un processeur contextuel.

2voto

stormlifter Points 1236

Si je comprends ce que vous voulez, le code ci-dessous devrait faire ce que vous voulez.

def __init__(self, *args, **kwargs):
        super(ClassName, self).__init__(*args, **kwargs)
        if siteA:
            help_text = "foo"
        else:
            help_text = "bar"
        self.form.fields["field_name"].help_text = help_text

C'est un exemple d'utilisation d'une certaine logique pour modifier un formulaire prioritaire. Donc vous avez juste mis ça dans le constructeur de votre ModelAdmin que vous avez remplacé.

0 votes

J'ajouterai juste que cette méthode sert à remplacer le formulaire.

-3voto

Nerdatastic Points 183

Juste une mise à jour de cette question. Vous pouvez le faire dans le modèle en utilisant help_text

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.help_text

2 votes

C'est pour un seul champ, et il a spécifiquement indiqué dans la question qu'il ne parlait pas de cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X