Django学习Day12——模型的使用(四)

Django中模型的使用

前面的三篇博客我们介绍了Django中关于ORM的基础知识以及数据库的增删改查,还有如何在Django项目中使用Redis数据库。

这篇博客我们实现一个简单的项目练习:设计四个页面,分别实现消息内容的增加、显示、删除和修改功能。因为我们还没有介绍表单提交的知识,所以在新增消息的时候,通过URL进行数据的传入。

准备工作:

(1)创建项目,注册应用。

(2)配置数据库

setting.py中设置数据库的连接信息:

在项目的__init__.py文件中添加如下代码:

(3)配置模版 

在根目录下创建templates文件夹,在settings.py中设置模版文件路径。

实现过程

1、消息类型设置为枚举类型,方便不同的消息类型以不同的颜色展示在前端页面(在app/consts.py中实现)

from enum import Enum

class MessageType(Enum):
    info = 'info'
    error = 'error'
    warning = 'warning'

MessageType.info.label = '消息'
MessageType.error.label = '错误'
MessageType.warning.label = '警告'

MessageType.info.color = 'green'
MessageType.error.color = 'red'
MessageType.warning.color = 'orange'

2、实现数据表的设计,用于存储添加的消息内容(app/models.py)

from django.db import models
from .consts import MessageType

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

    def __str__(self):
        return '消息内容:{}, 消息类型:{}'.format(self.content, self.message_type)

    # @property装饰器就是负责把一个类中的方法变成属性调用
    # 因此,在外面调用的时候,可以通过这样的方式:m = Message(), type = m.get_message_type。不用加括号
    @property
    def get_message_type(self):
        return MessageType[self.message_type]

将这里创建的Message模型,同步到本地MySQL数据库中:

  • python manage.py makemigrations
  • python manage.py migrate

3、实现对应的视图函数以及对应的模板文件

(1)添加数据

通过URL传入信息的内容,并且存储在数据库中,存储成功之后,跳转到信息展示界面。

app/view.py:

from django.shortcuts import render, reverse, redirect
from django.views.generic import View
from .models import Message
import time
from .consts import MessageType

class AddMessage(View):
    TEMPLATE = 'add_message.html'
    def get(self, request, message_type):
        data = {}
        message_content = request.GET.get('content', "")
        try:
            message_type_obj = MessageType[message_type]
        except Exception as e:
            return render(request, self.TEMPLATE, {'error':'没有这一消息类型'})
        if message_content:
            Message.objects.create(
                content = message_content,
                message_type = message_type,
                # 以时间戳的形式存储时间,方便之后的复用和转换
                created_time = time.time()
            )
            # redirect重定向到信息展示界面;
            # reverse是对已经命名的URL进行反向解析;URL的命名在urls.py中实现
            return redirect(reverse('show_messages'))

        else:
            data['error'] = '消息内容不能为空'
            return render(request, self.TEMPLATE, data)

templates/add_message.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Add Message</title>
</head>
<body>
{% if error %}
<div style="color: red">出现错误:{
   
   {error}} !</div>
{% endif %}
</body>
</html>

(2)展示数据

查询本地数据库中存储的所有信息内容,并且进行展示。如果输入查询条件,则展示查询得到的内容,如果不输入查询条件,则展示数据库中的全部内容。

app/view.py:

from django.shortcuts import render, reverse, redirect
from django.views.generic import View
from .models import Message
import time
from .consts import MessageType


class ShowMessage(View):
    TEMPLATE = 'show_message.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)

其中,因为我们的时间是以时间戳的形式在数据库中进行存储的,当在前端页面进行展示的时候,需要转化成我们可以理解的形式,这里以过滤器的方式进行实现。自定义过滤器的实现方式可以参见这篇博客:Django学习Day5——模版的使用(二)

在app目录下创建templatetags文件夹,实现自己的过滤器函数:

from django import template
import time

register = template.Library()

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

templates/show_message.html:

<!DOCTYPE html>
<html lang="en">
<!--调用自定义的时间转换过滤器-->
{% load my_filter %}
<head>
    <meta charset="UTF-8">
    <title>Show Message</title>
</head>
<body>
<ul>
    {% for message in messages %}
    <li style="color: {
   
   {message.get_message_type.color}}">
        【消息类型】:{
   
   {message.get_message_type.label}}  【消息内容】:{
   
   {message.content}}   【创建时间】:{
   
   {message.created_time|convert_time}}
    </li>
    {% endfor %}
</ul>
</body>
</html>

(3)删除数据

删除数据的话,我们在展示数据的前端页面增加一个按钮,点击该按钮实现删除功能。

app/views.py:

from django.shortcuts import render, reverse, redirect
from django.views.generic import View
from .models import Message
import time
from .consts import MessageType


class DeleteMessage(View):
    def get(self, request, message_id):
        messages = Message.objects.filter(
            id = message_id
        )

        messages.delete()
        # redirect重定向到信息展示界面;
        # reverse是对已经命名的URL进行反向解析;URL的命名在urls.py中实现
        return redirect(reverse('show_messages'))

templates/show_message.html:

<!DOCTYPE html>
<html lang="en">
<!--调用自定义的时间转换过滤器-->
{% load my_filter %}
<head>
    <meta charset="UTF-8">
    <title>Show Message</title>
</head>
<body>
<ul>
    {% for message in messages %}
    <li style="color: {
   
   {message.get_message_type.color}}">
        【消息类型】:{
   
   {message.get_message_type.label}}  【消息内容】:{
   
   {message.content}}   【创建时间】:{
   
   {message.created_time|convert_time}}
        <!--href这里这两种写法都是可以的-->
        <!--<a href="{% url 'delete_messages' message.id %}"><input type="button" id="delete" value="删除" /></a>-->
        <a href="/delete/{
   
   {message.id}}"><input type="button" id="delete" value="删除" /></a>
    </li>
    {% endfor %}
</ul>
</body>
</html>

(4)修改数据

修改数据的话,因为我们还没有学习表单提交的知识,所以这里的修改目前只能是通过URL的方式进行,所以为了简单起见,修改的内容我们这里统一定义为“要努力学习!”

我们在展示数据的前端页面再增加一个按钮,点击该按钮实现修改消息内容的功能。

app/views.py:

from django.shortcuts import render, reverse, redirect
from django.views.generic import View
from .models import Message
import time
from .consts import MessageType

class UpdateMessage(View):
    def get(self, request, message_id):
        messages = Message.objects.filter(
            id = message_id
        )

        messages.update(content='要努力学习!')
        # redirect重定向到信息展示界面;
        # reverse是对已经命名的URL进行反向解析;URL的命名在urls.py中实现
        return redirect(reverse('show_messages'))

templates/show_message.html:

<!DOCTYPE html>
<html lang="en">
<!--调用自定义的时间转换过滤器-->
{% load my_filter %}
<head>
    <meta charset="UTF-8">
    <title>Show Message</title>
</head>
<body>
<ul>
    {% for message in messages %}
    <li style="color: {
   
   {message.get_message_type.color}}">
        【消息类型】:{
   
   {message.get_message_type.label}}  【消息内容】:{
   
   {message.content}}   【创建时间】:{
   
   {message.created_time|convert_time}}
        <!--href这里这两种写法都是可以的-->
        <!--<a href="{% url 'delete_messages' message.id %}"><input type="button" id="delete" value="删除" /></a>-->
        <a href="/delete/{
   
   {message.id}}"><input type="button" id="delete" value="删除" /></a>
        <a href="/update/{
   
   {message.id}}"><input type="button" id="update" value="修改" /></a>
    </li>
    {% endfor %}
</ul>
</body>
</html>

(5)启动服务,运行如下:

添加数据:                                                                                                                            回车之后,跳转到消息展示界面:



删除数据:                                                                                                                            点击删除按钮,进行删除:

点击修改按钮,可以修改数据:

参考资料

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

猜你喜欢

转载自blog.csdn.net/ProQianXiao/article/details/113995050