django入门到精通⑩消息管理器和forms表单结合的使用及admin后台简单使用

1.django的配置

message_test/settings.py

app配置部分

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
    'app.templatetags',
]

模板部分

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR + '/templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

数据库部分

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'muke_lession_test',
        'USER':'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'PORT': 3306
    }
}
语言部分

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'asia/Shanghai'

2.消息管理器对于词汇的控制器
D:pythonmessage_testapp emplatetagscustom.py

# _*_ coding:utf-8 _*_
# __author__ == 'jack'
# __date__ == '2020-12-31 9:03 PM'

import jieba
from django import template
from app.consts import SensitiveWord
import time

register = template.Library()


@register.filter(name='deep_check_message')
def deep_check(value):
    # 只屏蔽关键词,替换为 * 号
    cut_message = jieba.lcut(value)
    new_message = []
    for m in cut_message:
        if m in SensitiveWord:
            new_message.append('*')
        else:
            new_message.append(m)
    if new_message:
        return ''.join(new_message)
    return value


@register.filter
def sample_check(value):
    # 自定义的关键词过滤器
    cut_message = jieba.lcut(value)
    print(cut_message)
    print(SensitiveWord)
    check = list(set(cut_message) & set(SensitiveWord))

    if len(check) != 0:
        return '该消息涉及违禁词汇,已被屏蔽'
    return value


@register.filter
def add_message_year(value, year):
    return '{} {}'.format(value, year)


@register.filter
def date_convert(value):
    timearray = time.localtime(value)
    otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timearray)
    return otherStyleTime

消息类型
D:pythonmessage_testappconsts.py

# _*_ coding:utf-8 _*_
# __author__ == 'jack'
# __date__ == '2020-12-31 8:28 PM'

from enum import Enum


class MessageType(Enum):
    info = "info"
    warning = "warning"
    error = "error"
    danger = "danger"
    delete = "delete"


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'
MessageType.delete.color = 'yellow'

SensitiveWord = ['天气', '坏人', '不开心']
SensiteveWordInit = ['专业', '生活']

3.表单部分
D:pythonmessage_testappforms.py

# _*_ coding:utf-8 _*_
# __author__ == 'jack'
# __date__ == '2021-01-22 8:49 PM'


import jieba

from django import forms

from .consts import MessageType,SensiteveWordInit


MESSAGE_TYPE_CHOICE = (
    (MessageType.info.value, MessageType.info.value),
    (MessageType.warning.value, MessageType.warning.value),
    (MessageType.error.value, MessageType.error.value),
    (MessageType.danger.value, MessageType.danger.value)
)

MESSAGE_TYPE_CHOICE = tuple(
    [(message.value, message.value) for message in MessageType]
)


class MessageForm(forms.Form):
    content = forms.CharField(label="消息内容", max_length=100, required=True)
    message_type = forms.CharField(
        label='数据类型',
        max_length=10,
        widget=forms.Select(choices=MESSAGE_TYPE_CHOICE)
    )

    def clean_message_type(self):
        message_type = self.cleaned_data.get('message_type')

        if not message_type:
            raise forms.ValidationError('消息类型不能为空')

        try:
            message_type_obj = MessageType[message_type]
        except:
            raise forms.ValidationError('无效的消息类型')
        return message_type_obj

    def clean_message(self):
        content = self.cleaned_data.gt('content')

        if not content:
            raise forms.ValidationError('消息不能为空')

        cut_message = jieba.lcut(content)

        check = list(set(cut_message) & set(SensiteveWordInit))

        if check:
            raise forms.ValidationError('消息涉及违禁词汇,已被屏蔽')

        return content

# 定义models
D:pythonmessage_testappmodels.py

# coding:utf-8

from django.db import models
from .consts import MessageType


class Message(models.Model):
    content = models.TextField()
    message_type = models.CharField(max_length=10, db_index=True)
    created_time = models.IntegerField(default=0)

    def __str__(self):
        return 'type:{}, content:{}'.format(self.message_type, self.content)

    @property
    def message_typ(self):
        try:
            return MessageType[self.message_type]
        except:
            return MessageType.info

app路由
app/urls.py

# _*_ coding:utf-8 _*_
# __author__ == 'jack'
# __date__ == '2020-12-29 8:27 PM'

from django.urls import path
from .views import LessionThree, LessionFourPageOne, LessionFourPageTwo, DeleteMessage, UpdateMessage, LessionFive

urlpatterns = [
    path('three/<str:message_type>', LessionThree.as_view(), name="three"),
    path('fourPageOne/<str:message_type>', LessionFourPageOne.as_view()),
    path('delete/', DeleteMessage.as_view()),
    path('update/', UpdateMessage.as_view()),
    path('fourPageTwo', LessionFourPageTwo.as_view(), name='fourpagetwo'),
    path('five', LessionFive.as_view(), name='five')
]

  总路由

from django.contrib import admin
from django.urls import path,include
from app import urls as app_urls

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(app_urls))
]

视图
D:pythonmessage_testappviews.py

# coding:utf-8

import time

from django.views.generic import View
# from django.http import HttpResponse
from django.shortcuts import render, redirect, reverse
from .consts import MessageType

from .models import Message
from .forms import MessageForm


class LessionThree(View):

    TEMPLATE = 'three.html'

    def get(self, request, message_type):

        data = {}

        try:
            message_type_obj = MessageType[message_type]
        except Exception as e:
            data['error'] = '没有这个消息类型{}'.format(e)
            return render(request, self.TEMPLATE, data)
        message = request.GET.get('message', '')

        if not message:
            data['error'] = '消息不能为空'
            return render(request, self.TEMPLATE, data)

        data['message'] = message
        data['message_type'] = message_type_obj

        # return HttpResponse(message_type)
        return render(request, self.TEMPLATE, data)


class LessionFourPageOne(View):
    TEMPLATE = 'four_page_one.html'

    def get(self, request, message_type):

        data = {}

        try:
            message_type_obj = MessageType[message_type]
        except Exception as e:
            data['error'] = '没有这个消息类型{}'.format(e)
            return render(request, self.TEMPLATE, data)
        message = request.GET.get('message', '')
        if not message:
            data['error'] = '消息不可为空'
            return render(request, self.TEMPLATE, data)
        Message.objects.create(
            content=message,
            message_type = message_type_obj.value,
            created_time=time.time()
        )

        return redirect(reverse('fourpagetwo'))


class LessionFourPageTwo(View):

    TEMPLATE = 'four_page_two.html'

    def get(self, request):
        data = {}
        search = request.GET.get('search', '')
        if search:
            messages = Message.objects.filter(content__contains=search)
        else:
            messages = Message.objects.all()

        data['messages'] = messages
        return render(request, self.TEMPLATE, data)


class DeleteMessage(View):

    def get(self, request):
        id = int(request.GET.get("id", 'no such id'))
        Message.objects.filter(id=id).delete()
        return redirect(reverse('fourpagetwo'))


class UpdateMessage(View):
    TEMPLATE = 'four_page_one.html'

    def get(self, request):
        data = {}
        try:
            id = int(request.GET.get("id", 'no such id'))

        except Exception as e:
            data['error'] = '找不到这个消息{}'.format(e)
            return render(request, self.TEMPLATE, data)

        message = request.GET.get('message', '')
        print("message={}".format(message))
        if not message:
            data['error'] = '消息不可为空'
            return render(request, self.TEMPLATE, data)

        Message.objects.filter(id=id).update(content = message)
        return redirect(reverse('fourpagetwo'))


class LessionFive(View):
    TEMPLATE = "five.html"

    def get(self, request):
        data = {}
        data['form'] = MessageForm()

        return render(request, self.TEMPLATE, data)

    def post(self, request):
        form = MessageForm(request.POST)

        if not form.is_valid():
            return render(request, self.TEMPLATE, {'form':form})

        content = form.cleaned_data.get("content", '')
        message_type = form.cleaned_data.get("message_type", "")

        Message.objects.create(
            content=content,
            message_type=message_type,
            created_time=time.time()
        )

        return redirect(reverse('fourpagetwo'))

4.前端展示
templates/three.html

{% load custom %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% if error %}
    <h3>error {{ error }}</h3>
{% else %}
    <label style="color:{{ message_type.color }}">{{ message_type.label }}</label>
    <span style="color:{{ message_type.color }}">{{ message|deep_check_message|add_message_year:2020 }}</span>
{% endif %}
</body>
</html>

D:pythonmessage_test emplatesfour_page_two.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% load custom %}
<h1>this page tow</h1>

{% for message in messages %}
        <li style="color:{{ message.message_typ.color }}">
            {{ message.id }}    {{ message.content }}   时间:{{ message.created_time|date_convert }}
            <a href="http://127.0.0.1:8000/delete?id={{ message.id }}">删除</a>
        </li>

{% endfor %}
</body>
</html>

D:pythonmessage_test emplatesfour_page_one.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ error }}
</body>
</html>

D:pythonmessage_test emplatesfive.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>five</title>
</head>
<body>
<form action="{% url 'five' %}" method="POST">

    {% csrf_token %}
    {% for item in form %}
        <div>
        <label for="{{ item.id_for_label }}">
            {{ item.label}}
        </label>
        {{ item }}
        </div>
        <p>
            {{ item.errors.as_text }}
        </p>
    {% endfor %}
    <span>{{ form.non_field_errors }}</span>
<input type="submit" value="提交" />
</form>
</body>
</html>

测试

admin管理模块的使用

app/admin.py

# coding:utf-8

from django.contrib import admin
from .models import Message
from django.utils.html import format_html

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'content', 'message_type', 'created_time']
    readonly_fields = ('message_type', 'created_time')

    list_filter = ('message_type', )
    search_fields = ['content']
    ordering = ['-id']
    list_per_page = 5

    def save_model(self, request, obj, form, change):

        if change:
            obj.content = obj.content + " update"
        else:
            obj.content = obj.content + ' create'

        super(MessageAdmin, self).save_model(self, obj, form, change)

    def return_href(self, obj):
        return format_html('<a href="{}">跳转', 'http://www.baidu.com')

app/models.py

# coding:utf-8

import time
from django.db import models
from .consts import MessageType


class Message(models.Model):
    content = models.TextField()
    message_type = models.CharField(max_length=10, db_index=True)
    created_time = models.IntegerField(default=0)

    def __str__(self):
        return 'type:{}, content:{}'.format(self.message_type, self.content)

    @property
    def message_typ(self):
        try:
            return MessageType[self.message_type]
        except:
            return MessageType.info


    def times(self):
        _time = time.localtime(self.created_time)
        return time.strftime('%Y-%m-%d% %H:%M:%S', _time)

原文地址:https://www.cnblogs.com/reblue520/p/14317097.html