Добавление текста справки по всей модели в форму администратора модели django - PullRequest
43 голосов
/ 16 сентября 2010

В моем приложении django я хотел бы иметь возможность добавить настраиваемый текст справки в форму смены администратора для некоторых из моих моделей. Обратите внимание, что я не говорю о специфическом для поля атрибуте help_text, который я могу установить для отдельных полей. Например, в верхней части формы изменения для My_Model в My_App я хотел бы иметь возможность добавить некоторый HTML-код с надписью «Для получения дополнительной информации о моей модели см. http://example.com", чтобы предоставить ссылка на внутреннюю документацию вики.

Есть ли какой-нибудь простой способ сделать это, или мне нужно создать специальную форму администратора для модели? Если да, можете ли вы дать мне пример того, как я это сделаю?

Ответы [ 5 ]

62 голосов
/ 16 сентября 2010

Используйте админские 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...

Вы можете иметь несколько наборов полей в администраторе. Каждый может иметь свой собственный заголовок (замените None выше заголовком). Вы также можете добавить 'classes': ('collapse',), к набору полей, чтобы он начинался свернутым (класс wide делает поля данных шире, а имена других классов означают, что ваш CSS говорит, что они делают).

Будьте осторожны: строка description считается безопасной , поэтому не помещайте туда неочищенные данные. Это сделано для того, чтобы при необходимости вы могли поместить туда разметку (например, ссылку), однако форматирование блоков (например, списки <ul>), вероятно, будет выглядеть неправильно.

28 голосов
/ 16 сентября 2010

Существует довольно простой, но недостаточно документированный способ сделать это.

Определение render_change_form в классе администратора

Во-первых, вам нужно передать дополнительный контекст вашему администратору. Для этого вы можете определить функцию render_change_form в своем классе администратора, например ::10000

# 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)

Создание собственного шаблона

Затем вам нужно создать этот пользовательский шаблон (change_form_help_text.html) и расширить стандартный 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 %}

Я решил разместить этот шаблон внутри шаблонов / admin / myapp /, но он также гибкий.


Более подробная информация доступна по адресу:

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

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

2 голосов
/ 09 сентября 2011

Если я понимаю, что вы хотите, приведенный ниже код должен делать то, что вы хотите.

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

Это пример использования некоторой логики для изменения переопределенной формы.Таким образом, вы просто помещаете это в свой конструктор ModelAdmin, который переопределили.

1 голос
/ 16 сентября 2010
0 голосов
/ 09 февраля 2012

Так же, как обновление к этому вопросу. Вы можете сделать это в модели, используя help_text

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

...