А зачем эта кнопка нужна, если можно 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',)
Ну а дальше дело за скриптом. С буфером обмена все довольно
костыльно,
некрасиво, но сделать можно. Скрипт надо сделать универсально: если у поля есть определенный класс, то стоит добавить кнопочку "в буфер". Как вы это будете делать - не важно, я бы бейджик какой-нибудь навесил с абсолютным позиционированием, но можно и
шаблон поправить.