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