Django学习Day7——模版的使用(四)

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"}}

参考资料

https://coding.imooc.com/class/393.html

猜你喜欢

转载自blog.csdn.net/ProQianXiao/article/details/113407521
今日推荐