Динамические начальные значения для модели Django
Как бы я мог предварительно заполнить поле в пользовательском интерфейсе администратора Wagtail параметрами HTTP GET? Я видел несколько решений, использующих устаревший contrib.ModelAdmin, но на самом деле не нашел ничего, используя новый ModelViewSet.
Моим упрощенным вариантом использования был бы простой календарь в пользовательском интерфейсе администратора (с использованием какого-нибудь календаря javascript, например fullcalandar.js), где я бы создал новое событие, перетащив временной интервал и указав браузеру URL-адрес, подобный /admin/event/new?start=начальная дата&end=конечная дата отображает форму события с полями "начало" и "конец", которые заполняются по таймфрейму.
У меня есть следующая модель
class Event(models.Model):
title = models.CharField(max_length=255)
[...]
class EventOccurrence(Orderable):
event = ParentalKey(Event, on_delete=models.CASCADE, related_name='event_occurrence')
start = DateTimeField()
end = DateTimeField()
До сих пор я пытался использовать пользовательский класс Form, наследуемый от WagtailAdminModelForm, который прекрасно работает для предварительного заполнения, но у меня нет возможности получить доступ к объекту запроса, чтобы получить параметры GET.
Полезно также, чтобы я использовал устаревший ModelAdmin или внедрил какой-нибудь javascript для предварительного заполнения полей во внешнем интерфейсе. Лично я бы хотел создать событие через API и просто направить пользователя на только что созданное событие, но я бы хотел избежать этого :) Я нашел несколько ссылок на CreatePageView, но, похоже, в modern Wagtail этого больше не существует.
У меня есть небольшое подозрение, что есть более простое решение. Что-то вроде создания моего собственного маршрута и простого затенения и перезаписи некоторых базовых классов и методов. Но моя трясогузка/джанго-фу определенно недостаточно сильна, чтобы понять, с чего начать).
Может быть, кто-нибудь может хотя бы указать мне правильное направление? Или, может быть, даже есть идея, как я мог бы использовать виджет выбора для той же задачи? Или, по крайней мере, модальное встраивание формы с предварительно заполненными полями.
Вы получаете доступ к экземпляру request
в FieldPanel.BoundPanel
. Вы можете использовать это для установки начального значения, если в поле еще нет значения.
Это работает в большинстве случаев с виджетами, но в некоторых Wagtail требуется что-то дополнительное для установки начального значения (включая виджет AdminDateTimeInput
). Вы можете сделать это с помощью метода render_html()
, хотя это и кажется немного халтурным, но в документации ничего не говорится о том, как работают эти виджеты, и комментарии к коду также не содержат никакой информации. Я использовал это в других случаях, когда мне нужно было преодолеть такое же препятствие.
Возможно, есть способ получше, но, по крайней мере, это работает:
CharField
здесь представлена демонстрация того, как это работает в простых случаях - никакого дополнительного рендеринга не требуется.
Замените FieldPanel
в вашем объявлении content_panels
на
PrepopulatePanel('start_date'),
или, если параметр строки запроса отличается от имени поля
PrepopulatePanel('start_date', 'some_parameter'),
Пример URL-адреса: http://localhost:8000/admin/pages/31/edit/?start_date=2025-12-30T093000%2B1200
Это произойдет 30 декабря 2025 года в 09:30 UTC+12 (NZDT). База данных (в примере) установлена на UTC, поэтому входные данные преобразуются (29 декабря 2025- 2030). Виджет автоматически преобразует это значение в настройку часового пояса в соответствии с профилем пользователя редактора, а затем возвращает его обратно при сохранении.