Django 在每个视图中显示消息

Posted

技术标签:

【中文标题】Django 在每个视图中显示消息【英文标题】:Django show message in every view 【发布时间】:2020-05-19 01:55:42 【问题描述】:

我想在我的 Django 项目的每个视图中显示一条消息。用户创建帐户后,我会向他们发送一封电子邮件,要求他们验证电子邮件,直到他们验证了电子邮件地址(通过访问验证 URL),我才会显示该消息。

现在,我不想在验证 URL 视图上显示消息,也不希望消息“重复”,即显示两条相同的消息。最初我尝试了创建一个中间件的方法,该中间件只需将消息添加到每个响应中,但这有两个缺点:

    消息出现在验证视图中 - 目前我从该视图中删除了所有消息,但这并不理想。 当我在视图中使用重定向时,我会收到不止一条相同的消息。我使用的大多数重定向都是在 POST 之后进行的,因此我可以检查请求是否为 GET,但感觉不对。

这是中间件:

class VerifiedEmailMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        if request.user.id is None:
            return self.get_response(request)

        if not request.user.profile.verified_email:
            messages.warning(request, 'We have sent you an email to verify your account. '
                                      'Please click the link in that email to verify your account.')

        response = self.get_response(request)

        return response

是否有标准或更好的方法来做到这一点?

【问题讨论】:

还有另一种变体,如果你有一些基本的 html 模板,那么你可以在那里添加条件 - 用户是否经过验证并决定是否显示消息。不确定它是否正确,但它似乎更简单 如果您想在每个视图上显示消息,直到他们验证电子邮件,那么您的中间件方法是一个很好的方法。为避免重复消息,您可以在添加之前使用 get_messages 方法检查它是否已经包含您的消息:docs.djangoproject.com/en/3.0/ref/contrib/messages/…,向下滚动到“模板之外” 我认为您可以通过简单地创建上下文处理器来实现这一点,并且可以检查用户是否已验证。根据它,您可以将一些上下文传递给您的模板 @Ashish 效果很好,如果您将其添加为答案,我会将其标记为已接受 【参考方案1】:

您可以通过简单地创建上下文处理器来实现这一点,并且可以检查用户是否经过验证。根据它,您可以将一些上下文传递给您的模板。 喜欢:

def myContextProcessor(request):
    return 
       "is_loggedIn": True
    

并在settings.py注册

'context_processors': [
    ...,  
    'project.context_processors.myContextProcessor'
]

【讨论】:

以上是关于Django 在每个视图中显示消息的主要内容,如果未能解决你的问题,请参考以下文章

来自 django 视图的 2 条消息 [关闭]

如果我们使用 django 通用视图,如何发送成功消息

POST表单提交后django显示消息

Django视图按用户向访问者显示对象

Python Django:在视图中向对象添加属性还是制作数据字典更好?

Swift UI:当视图中显示空列表时,如何显示错误消息?