Редактирование содержимого файла FileField из Django Admin
У меня есть ситуация, когда у меня есть скрипты python, которые хранятся в виде файлов, которые необходимо изменять из панели администратора. В настоящее время некоторые из моих моделей могут иметь скрипты, прикрепленные к ним:
class Action(PolymorphicModel):
title = models.CharField(max_length=100)
text = BBCodeField('text', blank=True)
action_script = models.FileField(upload_to='action_scripts')
В моей панели администратора я могу загрузить файл, но меня попросили сделать этот файл редактируемым на месте, если у пользователя есть соответствующие права. Я искал идиоматический способ сделать это, и на данный момент у меня есть следующие идеи:
- Override the
FileFieldwidget to include an text edit box and save button. This seems very brute forced - Replace
models.FileFieldwith subclass ofmodels.TextField, implement read from file, save to file, but then I lose the upload widget and data still gets stored in DB. This seems dirty because in the database all I'm storing is a filename.FileFieldfeels like the right field type here. - Write a custom
ModelFormthat includesforms.TextField. Handle save to file using thesavemethod. I'm not sure how to accomplish this because I would have to generate a filename on the fly and I don't have a primary key yet. Maybe some sort of UUID?
Сейчас я склоняюсь к двери номер 3, но я использую Django всего неделю, поэтому я не уверен, что это правильный путь, или даже как это сделать.
Дальнейшие осложнения:
- Не все
Actionнуждаются в скриптах. Если текстовое поле пустое,FileFieldможет просто статьNull. Actionподклассифицируется в несколько производных классов. Функциональность редактирования должна распространяться на админ-панель каждой модели масштабируемым способом, как и другие поля. .
Этот вопрос кажется достаточно общим, чтобы его решение было полезным для тех, кто хочет редактировать HTML или CSS из админки и т.д., как это делает WordPress. Поиск в этом направлении, к сожалению, приводит к результатам, связанным со скинами администратора, что мне не нужно. В моей ситуации я пытаюсь избежать хранения кода python в базе данных по соображениям безопасности. Интерфейс администратора не будет открыт для конечных пользователей, поэтому теоретически он должен быть безопасным, и я получаю преимущества кэширования, компиляции и локальности (меньше обращений к БД).
Большое спасибо.