Django中模版的使用
在之前的博客中,我们已经介绍了Django中模版的基础知识和使用方法,以及两种其他的模版引擎。这一篇博客实现一个简单的小项目需求,对于之前的知识进行回顾。
需求如下:
URL中传入不同的消息类型以及对应的消息内容,后端对传入的消息类型和消息内容进行处理,返回给前端,实现对于不同消息类型,以不同的颜色在前端页面进行展示,并且对敏感词汇进行过滤处理。
实现过程
1、创建项目
创建名为classify_message的项目:
并完成相关的配置:
(1)注册应用 (2)配置模版文件路径
2、定义消息类型
在app目录下创建consts.py文件,使用枚举类型定义不同的消息类型:(关于Python中枚举类型的用法可以参见这篇博客)
from enum import Enum
class MessageType(Enum):
info = "info"
warning = "warning"
error = "error"
danger = "danger"
MessageType.info.label = "信息"
MessageType.warning.label = "警告"
MessageType.error.label = "错误"
MessageType.danger.label = "危险"
MessageType.info.color = "green"
MessageType.warning.color = "orange"
MessageType.error.color = "gray"
MessageType.danger.color = "red"
3、后端对消息进行处理
URL中传入的信息有两部分,一部分是消息类型(/分隔符的形式获取),另一部分是消息内容(?的形式获取)。我们根据消息类型对消息进行不同颜色的展示,根据消息内容进行敏感词汇的过滤。
(1)视图函数中,对传入内容(消息类型和消息内容)进行获取,返回给前端模版渲染(app/views.py):
# coding:utf-8
from django.shortcuts import render
from .consts import MessageType
from django.views.generic import View
class Process_Message(View):
TEMPLATE = "message.html"
def get(self, request, message_type):
data = {}
try:
message_obj = MessageType[message_type]
except Exception as e:
data['error'] = "没有该消息类型:{}".format(e)
return render(request, self.TEMPLATE, data)
message_content = request.GET.get("message_content","")
if not message_content:
data['error'] = "消息内容不能为空"
return render(request, self.TEMPLATE, data)
data['message_obj'] = message_obj
data['message_content'] = message_content
return render(request, self.TEMPLATE, data)
(2)模版文件(templates/message.html)中接收视图渲染过来的数据,并根据消息类型进行不同颜色的展示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% if error %}
<label>error: </label>
<span>{
{error}}</span>
{% else %}
<label style="color: {
{message_obj.color}}">{
{message_obj.label}} : </label>
<span style="color: {
{message_obj.color}}">{
{message_content}}</span>
{% endif %}
</body>
</html>
(3)配置路由(app/urls.py和classify_message/urls.py)
(4)启动服务,进行访问,可以看到不同的消息类型显示不同的颜色:
(5)对消息内容进行敏感词汇的过滤
对消息内容进行敏感词汇的过滤,这里使用过滤器的方式来进行实现。
首先,我们在app/consts.py文件(常量一般定义在consts.py中)中定义敏感词汇。
from enum import Enum
class MessageType(Enum):
info = "info"
warning = "warning"
error = "error"
danger = "danger"
MessageType.info.label = "信息"
MessageType.warning.label = "警告"
MessageType.error.label = "错误"
MessageType.danger.label = "危险"
MessageType.info.color = "green"
MessageType.warning.color = "orange"
MessageType.error.color = "gray"
MessageType.danger.color = "red"
SensitiveWords = ["天气","我们","开车"]
之后我们定义自己实现的过滤器函数,实现对敏感词汇的过滤,关于自定义过滤器的实现可以参见这篇博客。
实现如下(在app目录下创建templatetags/myfilter.py文件):
from django import template
from app.consts import SensitiveWords
register = template.Library()
@register.filter(name="message_filter")
# name参数定义了过滤器函数的名称,在模版文件中通过这一名称进行调用
def my_filter(values):
for word in SensitiveWords:
if word in values:
values = values.replace(word, "*")
return values
之后对我们的模版文件(message.html)稍作修改,加上过滤器函数:
<!DOCTYPE html>
{% load myfilter %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% if error %}
<label>error: </label>
<span>{
{error}}</span>
{% else %}
<label style="color: {
{message_obj.color}}">{
{message_obj.label}} : </label>
<span style="color: {
{message_obj.color}}">{
{message_content|message_filter}}</span>
{% endif %}
</body>
</html>
之后,启动服务,进行访问,可以看到会过滤掉我们事先定义的敏感词汇:
(6)补充内容
这里对之前的过滤器函数进行一点补充,在前端模版文件中,对于渲染过来的数据,我们可以叠加多个过滤器函数进行处理。
例如我们自定义get_year()过滤器函数:
@register.filter
def get_year(values, args):
return "{} {}".format(values, args)
然后在前端模版文件中,就可以叠加使用:
<span style="color: {
{message_obj.color}}">{
{message_content|message_filter|get_year:"2021"}}</span>
访问显示如下:
另外,在过滤器函数中,我们向过滤器函数传入的参数只能有一个,即过滤器 “:” 后面只能跟一个值,如果我们有多个参数需要传入,应该如何处理?
其实,我们可以使用字符串的形式进行传入,使用分隔符将多个参数进行分隔开,之后在后端过滤器函数内部进行多个参数值的获取即可。例如:
{ {values|my_filter:"args1,args2,args3"}}