Динамические начальные значения для модели 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). Виджет автоматически преобразует это значение в настройку часового пояса в соответствии с профилем пользователя редактора, а затем возвращает его обратно при сохранении.

Вернуться на верх