Администратор Wagtail: как контролировать, куда перенаправляется пользователь после отправки изменений на модерацию

#python #django #wagtail #wagtail-admin

#python #django #wagtail #wagtail-admin

Вопрос:

На созданном мной сайте Wagtail у меня есть тип модели, который могут редактировать аутентифицированные пользователи, у которых нет полных прав администратора. Они могут сохранять только как черновик или отправлять изменения на модерацию. Проблема, с которой я сталкиваюсь, заключается в том, что Wagtail не согласуется с тем, куда он перенаправляет после выполнения этих двух действий. Сохранение черновика возвращает пользователя к экрану редактирования, на котором он только что был, с примечанием о том, что черновик был сохранен (хорошо). Отправка на модерацию возвращает пользователя в режим просмотра администратором родительской страницы, на которой отображаются все дочерние узлы в списке. Они не могут редактировать подавляющее большинство элементов в этом списке, поэтому я думаю, что это сбивает с толку пользователя, не являющегося администратором. Я хотел бы, чтобы действие «Отправить на модерацию» определяло, принадлежит ли пользователь к группе, отличной от администратора (или, в противном случае, есть ли на странице неопубликованные изменения, как в моем примере кода ниже), и, если да, перенаправлять их обратно на экран редактирования, как это делает «Сохранить как черновик».

Я попробовал это в своем определении модели, и это не сработало:

 def save(self, *args, **kwargs):
  #do some field value manipulations here before saving
  super().save(*args, **kwargs)
  if self.id:
    if self.has_unpublished_changes:
      return HttpResponseRedirect('/admin/pages/'   str(self.id)   '/edit/')
  

Вероятно, есть какое-то действие администратора Wagtail, которое мне нужно подключить и переопределить, вместо того, чтобы пытаться выполнить это в models.py , но у меня нет большого опыта в этом, поэтому мне нужно лучше понимать, что менять и где.

Ответ №1:

Настройте after_create_page и after_edit_page перехват: https://docs.wagtail.io/en/stable/reference/hooks.html#after-create-page

Для этого добавьте wagtail_hooks.py файл в одно из приложений вашего проекта. Здесь вы можете определить функции, которые будут вызываться после создания или редактирования страницы через администратора, такие как:

 from wagtail.core import hooks

@hooks.register('after_create_page')
def redirect_after_page_create(request, page):
    if not request.user.is_superuser:
        return HttpResponseRedirect('/admin/pages/'   str(page.id)   '/edit/')

@hooks.register('after_edit_page')
def redirect_after_page_edit(request, page):
    if not request.user.is_superuser:
        return HttpResponseRedirect('/admin/pages/'   str(page.id)   '/edit/')
  

Комментарии:

1. Спасибо! Это сработало отлично, и у меня уже было несколько крючков wagtail, настроенных для другой цели, так что это было очень легко реализовать. Сначала я получил сообщение об ошибке, в котором говорилось, что HttpResponseRedirect не определен, но было достаточно просто посмотреть, как включить это из django.http.