Как добавить кнопку «Копировать в буфер» в django admin?

Подскажите, пожалуйста, какой самый простой способ к конкретному полю в django-admin добавить ссылку или кнопку "Копировать в буфер" содержимое данного поля?
  • Вопрос задан
  • 774 просмотра
Пригласить эксперта
Ответы на вопрос 1
А зачем эта кнопка нужна, если можно ctrl+a и ctrl+c? Ведь оно костыль. Напишите лучше об этом, например, в help_text, если надо в паре мест, или даже в шаблон жирными буквами.

Но если все-таки есть желание... Самый простой способ - это поискать тут. Если там ничего нет, то остается "сложный".

Я так понял, что речь идет именно про страницу редактирования. Нужно сделать отдельное приложение с скриптиком на JS и/или кастомным шаблоном, а также сделать класс/миксин для админки, чтобы удобно делать что-то в стиле:

class YourModelAdmin(ClipboardMixin, admin.ModelAdmin):
    clipboard_fields = ('clipboardable_field',)

Передать в шаблон нужные поля можно по-разному:
  • Передать в контекст имена нужных полей (см. пример в доках, который показывает, как в контекст что-нибудь передать).
  • Закастомить виджет поля формы, добавив туда определенный класс, если нужно.

Второй вариант вижу правильным, его и будем реализовывать.

class ClipboardMixin(object):
    #change_form_template = 'admin/clipboard_change_form.html'
    clipboard_class_name = 'your-clipboard-class'
    clipboard_fields = ()

    def get_form(self, request, obj=None, **kwargs):
        form = super(ClipboardModelAdmin, self).get_form(request, obj=None, **kwargs)
        for i in self.clipboard_fields:
            if i in form.base_fields:
                if 'class' in form.base_fields[i].widget.attrs:
                    form.base_fields[i].widget.attrs['class'] += ' '+self.clipboard_class_name
                else:
                    form.base_fields[i].widget.attrs['class'] = self.clipboard_class_name
        return form

    class Media:
        js = ('admin/clipboard.js',)

Ну а дальше дело за скриптом. С буфером обмена все довольно костыльно, некрасиво, но сделать можно. Скрипт надо сделать универсально: если у поля есть определенный класс, то стоит добавить кнопочку "в буфер". Как вы это будете делать - не важно, я бы бейджик какой-нибудь навесил с абсолютным позиционированием, но можно и шаблон поправить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы