#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.