如何根据用户登录状态切换 wagtail 主页
How to switch wagtail homepage depending on user logged in status
我之前一直在为我的 home_page url 使用 path("", include(wagtail_urls))
,它在 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),登录后主页无法正确显示,因为 html 中的所有 wagtail 标签,例如博客文章未显示
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函数中指定home_page?
include(wagtail_urls)
引入 Wagtail 的页面处理逻辑,用于 select 为给定的 URL 返回哪个页面。如果你用你自己的代码换掉那一行,你实际上换掉了所有的 Wagtail...
首先,考虑您是否正在重新发明 Wagtail 已经提供的 page privacy 功能。如果您希望整个站点都需要登录,并为 non-logged-in 用户提供通用的通用登录表单,您可以使用“设置”选项卡下的“隐私”控件启用此功能(或在旧版本的右上角) Wagtail releases) 编辑主页时,在项目设置文件中设置WAGTAIL_FRONTEND_LOGIN_TEMPLATE = "home/not_authenticated.html"
。
如果您只是想专门为主页交换模板,您可以通过 defining a get_template
method 在您的主页模型上执行此操作:
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"
这样,您的主页将 select 一个模板或另一个模板,但仍然保持模板上的 page
对象可用。
我之前一直在为我的 home_page url 使用 path("", include(wagtail_urls))
,它在 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),登录后主页无法正确显示,因为 html 中的所有 wagtail 标签,例如博客文章未显示
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函数中指定home_page?
include(wagtail_urls)
引入 Wagtail 的页面处理逻辑,用于 select 为给定的 URL 返回哪个页面。如果你用你自己的代码换掉那一行,你实际上换掉了所有的 Wagtail...
首先,考虑您是否正在重新发明 Wagtail 已经提供的 page privacy 功能。如果您希望整个站点都需要登录,并为 non-logged-in 用户提供通用的通用登录表单,您可以使用“设置”选项卡下的“隐私”控件启用此功能(或在旧版本的右上角) Wagtail releases) 编辑主页时,在项目设置文件中设置WAGTAIL_FRONTEND_LOGIN_TEMPLATE = "home/not_authenticated.html"
。
如果您只是想专门为主页交换模板,您可以通过 defining a get_template
method 在您的主页模型上执行此操作:
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"
这样,您的主页将 select 一个模板或另一个模板,但仍然保持模板上的 page
对象可用。