Django小技巧14: messages 框架

Django小技巧14: messages 框架

Posted October 30, 2018

翻译整理自: simpleisbetterthancomplex.com

让用户知道应用程序发生了什么, 是个极好的用户体验。让应用程序和用户之间能够有个很好的『交流』是个不错的选择。

设想一下下面场景:

  • 用户: 点击保存按钮
  • 应用程序: 什么都没有发生
  • 所以是否保存了数据? 用户并不知道
  • 这时一些急性子就疯狂的点击,点击,点击...

所以, 要让用户不要慌...

配置

默认情况下,Django 项目内置了messages框架, 如果你没有更改这些配置, 只需要跳到下一节。 如果有改动, 按照下面这样设置:

  • NSTALLED_APPS
    • django.contrib.messages
  • MIDDLEWARE 或者 MIDDLEWARE_CLASSES(老版本)
    • django.contrib.sessions.middleware.SessionMiddleware
    • django.contrib.messages.middleware.MessageMiddleware
  • TEMPLATES
    • context_processors
      • django.contrib.messages.context_processors.messages

消息级别和标签

Constant

Level

Tag

Purpose

DEBUG

10

debug

开发相关的消息

INFO

20

info

用户级别消息

SUCCESS

25

success

一个操作的成功消息

WARNING

30

warning

失败但非迫在眉睫的消息

ERROR

40

errror

操作未成功或发生错误

默认情况下, Django 只会显示 level >= 20 (INFO)的消息, 如果显示DEBUG消息, 可以在设置中:

settings.py

Python

from django.contrib.messages import constants as message_constants
MESSAGE_LEVEL = message_constants.DEBUG

为了避免遇到导入循环, 可以直接设置 level.

Python

MESSAGE_LEVEL = 10  # DEBUG

使用

在视图里面必要的地方添加, 触发消息的逻辑, 在模板里面添加显示的代码, 就可以使用消息啦

views.py

Python

from django.contrib import messages

@login_required
def password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(request.user, request.POST)
        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)
            messages.success(request, 'Your password was updated successfully!')  # <-
            return redirect('settings:password')
        else:
            messages.warning(request, 'Please correct the error below.')  # <-
    else:
        form = PasswordChangeForm(request.user)
    return render(request, 'profiles/change_password.html', {'form': form})

然后template中

Django/Jinja

{% if messages %}
  <ul class="messages">
    {% for message in messages %}
      <li class="{{ message.tags }}">{{ message }}</li>
    {% endfor %}
  </ul>
{% endif %}

如果添加成功了, 则输出的 html 应该是这样呢, 可以看到实际上标签应该和你的用户美化messsage的 css 对应。

HTML

<ul class="messages">
  <li class="success">Your password was updated successfully!</li>
</ul>

你可以对 message, 添加额外的标签:

Python

messages.success(request, 'Your password was updated successfully!', extra_tags='alert')

输出html 为:

HTML

<ul class="messages">
  <li class="success alert">Your password was updated successfully!</li>
</ul>

内置方法介绍:

Python

messages.debug(request, 'Total records updated {0}'.format(count))
messages.info(request, 'Improve your profile today!')
messages.success(request, 'Your password was updated successfully!')
messages.warning(request, 'Please correct the error below.')
messages.error(request, 'An unexpected error occured.')

# Or...

messages.add_message(request, messages.DEBUG, 'Total records updated {0}'.format(count))
messages.add_message(request, messages.INFO, 'Improve your profile today!')

# Useful to define custom levels:
CRITICAL = 50
messages.add_message(request, CRITICAL, 'A very serious error ocurred.')

和Bootstrap结合代码片段

  • messages.html

Django/Jinja

{% for message in messages %}
  <div class="alert {{ message.tags }} alert-dismissible" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
    {{ message }}
  </div>
{% endfor %}
  • settings.py

Bootstrap 中定义了如alert-info或者alert-successalert-*的组件css. 所以我们需要更改下默认的 tags.

Python

from django.contrib.messages import constants as messages

MESSAGE_TAGS = {
    messages.DEBUG: 'alert-info',
    messages.INFO: 'alert-info',
    messages.SUCCESS: 'alert-success',
    messages.WARNING: 'alert-warning',
    messages.ERROR: 'alert-danger',
}
  • base.html

然后把messages.html添加到需要显示的地方:

Django/Jinja

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Simple is Better Than Complex</title>
  </head>
  <body>
    {% include 'partials/header.html' %}
    <main>
      <div class="container">
        {% include 'partials/messages.html' %}
        {% block content %}
        {% endblock %}
      </div>
    </main>
    {% include 'partials/footer.html' %}
  </body>
</html>

阅读更多关于messages框架的文档. Django Documentation

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ceph对象存储方案

Ceph的磁盘管理tips

换盘的时候一定要验明正身,原生的ceph-disk方式对磁盘分区的信息标记实在是太粗糙,很容易看花眼,比如下面这个例子,虽然通过PARTLABEL可以区分jou...

2487
来自专栏玄魂工作室

Hacker基础之Linux篇:基础Linux命令十六

今天我们来学习几个小知识,不一定是Linux的命令,都是用于查看Linux的系统信息的

1553
来自专栏Java帮帮-微信公众号-技术文章全总结

02.WebService_使用三要素

02.WebService_使用三要素 一、Java中WebService规范 JAVA 中共有三种WebService 规范,分别是JAX-WS、J...

3676
来自专栏IT笔记

SpringBoot开发案例之微信小程序文件上传

最近在做一个口语测评的小程序服务端,小程序涉及到了音频文件的上传,按理说应该统一封装一个第三方上传接口服务提供给前段调用,但是开发没有那么多道理,暂且为了省事就...

6957
来自专栏Java编程技术

你真的了解Netty中@Sharable?

Netty 是一个可以快速开发网络应用程序的基于事件驱动的异步 网络通讯 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的应用还是比较...

1423
来自专栏用户2442861的专栏

使用IntelliJ IDEA开发SpringMVC网站(四)用户管理

转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 。

2281
来自专栏JavaEE

springboot快速入门前言:一、springboot简介:二、springboot常用知识点:总结:

正所谓,天下武功,唯快不破,在当今生活节奏越来越快的时代,我们也要讲求效率,也要追求一个快字(不过有些方面还是不能快的,不要当快男哦)。springboot就是...

991
来自专栏张戈的专栏

修改Apache的超时设置,解决长连接请求超时问题

某日,组内后台开发找到我,问我们的 WEB 服务器超时设置是多少。他反馈的问题是,有一个 VLAN 切换任务 cgi 接口经常返回 504 网关超时错误,要我分...

9518
来自专栏FreeBuf

新手指南:DVWA-1.9全级别教程(完结篇,附实例)之XSS

* 本文原创作者:lonehand,转载请注明来自FreeBuf.COM 目前,最新的DVWA已经更新到1.9版本(http://www.dvwa.co.uk...

1.2K5
来自专栏程序猿DD

Spring Boot中使用LDAP来统一管理用户信息

很多时候,我们在构建系统的时候都会自己创建用户管理体系,这对于开发人员来说并不是什么难事,但是当我们需要维护多个不同系统并且相同用户跨系统使用的情况下,如果每个...

7286

扫码关注云+社区

领取腾讯云代金券