如何根据用户登录状态切换 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 对象可用。