Как переключать домашнюю страницу трясогузки в зависимости от статуса пользователя, вошедшего в систему
Ранее я использовал path("", include(wagtail_urls)) для url домашней страницы, который правильно отображал шаблон home/home_page.html
Однако я хочу отображать разные страницы в зависимости от того, вошел ли пользователь в систему или нет, поэтому я изменил это на:
def logged_in_switch_view(logged_in_view, logged_out_view):
'''switches views dependedn on logon status'''
def inner_view(request, *args, **kwargs):
if request.user.is_authenticated:
return logged_in_view(request, *args, **kwargs)
return logged_out_view(request, *args, **kwargs)
return inner_view
urlpatterns = [
path("",
logged_in_switch_view(
TemplateView.as_view(template_name="home/home_page.html")),
TemplateView.as_view(template_name="home/not_authenticated.html")),
name="home"),
]
При таком подходе (прямое указание шаблона, а не использование wagtail_urls) домашняя страница не отображается корректно при входе в систему, т.е. все теги wagtail в html, например, записи блога, не отображаются
home_page.html
{% extends "base.html" %}
{% load wagtailcore_tags wagtailimages_tags %}
{% block content %}
<main class="container">
{% for post in page.blogs %}
{% with post=post.specific %}
<div class="col-md-8 mx-auto px-auto">
<div class="row border rounded overflow-auto flex-md-row mb-4 shadow-sm position-relative ">
<div class="col p-4 d-flex flex-column position-static">
<strong class="d-inline-block mb-2 text-primary">{{ post.category }}</strong>
<div class="mb-1 text-muted">{{ post.date }}</div>
<h3 class="mb-0">{{ post.title }}</h3>
<p>{{post.intro}}</p>
</div>
<div class="col-auto my-auto py-2 px-2 d-none d-lg-block">
<a href="{% pageurl post %}" class="stretched-link">
{% with post.main_image as main_image %}{% if main_image %}
{% image main_image min-250x250 max-350x350%}
{% endif %}{% endwith %}
</a>
</div>
</div>
</div>
{% endwith %}
{% endfor %}
</main>
{% endblock %}
Как указать домашнюю_страницу в функции logged_in_switch_view?
Строка include(wagtail_urls) втягивает логику обработки страниц Wagtail для выбора страницы, которая должна быть возвращена для данного URL. Если вы замените эту строку своим собственным кодом, вы фактически замените весь Wagtail...
Сначала подумайте, не изобретаете ли вы заново функцию конфиденциальности страницы, которую уже предоставляет Wagtail. Если вы хотите, чтобы сайт в целом требовал входа, а незалогиненным пользователям предоставлялась пустая общая форма входа, вы можете включить эту функцию с помощью элемента управления Privacy на вкладке Settings (или в правом верхнем углу в старых версиях Wagtail) при редактировании главной страницы и установить WAGTAIL_FRONTEND_LOGIN_TEMPLATE = "home/not_authenticated.html" в файле настроек проекта.
Если вы просто хотите поменять шаблон конкретно для домашней страницы, вы можете сделать это, определив get_template метод в вашей модели HomePage:
class HomePage(Page):
# ...
def get_template(self, request, *args, **kwargs):
if request.user.is_authenticated:
return "home/home_page.html"
else:
return "home/not_authenticated.html"
Таким образом, ваша домашняя страница будет выбирать один шаблон или другой, но при этом сохранять объект page, доступный на шаблоне.