写在前面
本期内容
- 基于django的简单网页计数器
所需环境
- python
- pycharm或vscode
- django
下载地址
- https://download.csdn.***/download/m0_68111267/88795604
Django简介
Django 是一个用 Python 编写的高级、开源 Web 开发框架,以其高效、安全和可扩展性而闻名。该框架遵循模型-视图-模板(Model-View-Template, MVT)设计模式,简化了复杂数据库驱动网站的开发流程。
在 Django 中,模型(Model)负责处理应用程序的数据结构以及与数据库的交互,通过 ORM 提供了一种直观的方式来定义数据库表结构并进行 CURD 操作。
视图(View)是处理用户请求的核心部分,视图函数或类接收请求数据,执行业务逻辑,并决定返回给用户的响应内容。
模板(Template)系统则用于渲染前端界面,允许开发者使用简洁易懂的语法来嵌入变量和逻辑,分离了展示层代码和业务逻辑。
Django 内置了强大的后台管理界面,使得快速构建内容管理系统变得轻而易举。它还提供认证、授权、会话管理、中间件、URL 路由、静态文件处理等众多功能,大大加速了 Web 应用程序的开发速度。
此外,Django 支持 RESTful API 开发,通过 Django Rest Framework 可以轻松构建强大的 API 服务。其安全性高,社区活跃,拥有丰富的第三方库支持,适用于从个人博客到企业级复杂应用的各类项目开发。总之,Django 是一款强大且全面的 Web 开发框架,旨在使开发者能够关注于编写高质量的应用程序,而不是重复造轮子。
主要程序
- views.py
from django.views.generic import ListView
from django.views.generic import DetailView
from .models import Article
class ArticleDetailView(DetailView):
model = Article
def get_object(self, queryset=None):
obj = super().get_object(queryset=queryset)
obj.viewed()
return obj
class ArticleListView(ListView):
queryset = Article.objects.filter(status='p').order_by('-pub_date')
paginate_by = 6
……(请下载后查看完整代码)
这段代码定义了两个基于 Django Generic Views 的视图类,用于处理文章列表和文章详情页面的显示:
-
ArticleDetailView
类:-
继承自
django.views.generic.DetailView
,这是一个用于展示单个模型对象详细信息的视图。 -
model = Article
:指定该视图将处理Article
模型的对象。 -
重写了
get_object
方法:- 使用
super().get_object(queryset=queryset)
调用父类方法获取请求对应的文章对象。 - 在获取到对象后立即调用
obj.viewed()
方法,这会增加文章的浏览量(views 字段加 1)。 - 最后返回文章对象。这样每次用户访问文章详情页时,都会触发浏览次数的更新。
- 使用
-
-
ArticleListView
类:- 继承自
django.views.generic.ListView
,用于显示一个包含多个模型对象的列表视图。 -
queryset = Article.objects.filter(status='p').order_by('-pub_date')
:设置默认查询集为所有状态为“已发表”(‘p’)的文章,并按照发布时间降序排列。 -
paginate_by = 6
:设置了分页功能,每页显示6篇文章。这意味着如果文章数量超过6篇,将会自动创建分页链接以便用户可以翻页查看其他文章。
- 继承自
通过这两个视图,网站可以方便地渲染文章列表页面(按发布时间排序并分页)以及单篇文章的详情页面(同时记录并更新文章的浏览量)。
- models.py
from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
from django.utils.timezone import now
class Article(models.Model):
STATUS_CHOICES = (
('d', '草稿'),
('p', '发表'),
)
title = models.CharField('标题', max_length=200, unique=True)
slug = models.SlugField('slug', max_length=60)
body = models.TextField('正文')
pub_date = models.DateTimeField('发布时间', default= now, null=True)
create_date = models.DateTimeField('创建时间', auto_now_add=True)
mod_date = models.DateTimeField('修改时间', auto_now=True)
status = models.CharField('文章状态', max_length=1, choices=STATUS_CHOICES, default='p')
views = models.PositiveIntegerField('浏览量', default=0)
author = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)
……(请下载后查看完整代码)
这段代码定义了一个名为 Article
的 Django 模型类,用于表示博客文章。下面对各个部分进行详细分析:
-
导入相关模块:
- 从
django.db.models
导入models
类,用于定义数据库模型。 - 从
django.contrib.auth.models
导入User
类,表示系统中的用户模型,以便在 Article 中引用文章的作者。 - 从
django.urls
导入reverse
函数,用于生成 URL 链接。 - 从
django.utils.timezone
导入now
函数,获取当前时间。
- 从
-
定义
Article
类继承自models.Model
,这是 Django 数据库模型的基本类。 -
STATUS_CHOICES
:一个元组列表,用于设置文章状态字段的可选项,包括草稿(draft)和已发表(published)两种状态。 -
字段定义:
-
title
: 文章标题,CharField 类型,最大长度为 200 个字符,并要求唯一(unique=True)。 -
slug
: slug 字段,通常用于创建 SEO 友好的 URL,SlugField 类型,最大长度为 60 个字符。 -
body
: 文章正文,TextField 类型,可以存储大量文本内容。 -
pub_date
: 发布日期时间,DateTimeField 类型,默认值为当前时间(now),允许为空(null=True)。 -
create_date
: 创建日期时间,DateTimeField 类型,自动设置为对象创建时的时间(auto_now_add=True)。 -
mod_date
: 修改日期时间,DateTimeField 类型,自动更新为对象最后一次修改的时间(auto_now=True)。 -
status
: 文章状态,CharField 类型,长度为 1,其选择范围由STATUS_CHOICES
定义,默认值为已发表(‘p’)。 -
views
: 文章浏览量,PositiveIntegerField 类型,默认值为 0。 -
author
: 文章作者,ForeignKey 类型,关联到 User 模型,当该文章被删除时,会级联删除(on_delete=models.CASCADE)。
-
-
定义字符串表示方法
__str__
,返回文章的标题,方便在管理后台或其他地方显示。 -
Meta 类内定义元信息:
-
ordering
: 指定默认排序方式,按照发布日期降序排列(‘-pub_date’)。 -
verbose_name
和verbose_name_plural
:设置单数和复数形式的模型名称,在后台展示时使用。 -
get_latest_by
:指定获取最新文章时依据的字段,这里是 ‘create_date’。
-
-
定义
get_absolute_url
方法,返回文章详情页的 URL,通过传递文章ID给路由 ‘blog:article_detail’ 来实现。 -
定义
viewed
方法,用于增加文章的浏览量。每当调用此方法时,文章的views
字段加1,并仅更新views
字段 (update_fields=['views']
)。这个方法可以在视图函数中调用,以确保每次访问文章详情页面时更新浏览次数。
运行结果
系列文章
序号 | 目录 | 直达链接 |
---|---|---|
1 | 入门实战丨基于Tkinter的简易计算器 | https://want595.blog.csdn.***/article/details/131731173 |
2 | 入门实战丨基于Tkinter的生日管理系统 | https://want595.blog.csdn.***/article/details/131731380 |
3 | 数据库实战丨基于Tkinter+MySQL的学生成绩管理系统 | https://want595.blog.csdn.***/article/details/130992721 |
4 | 数据库实战丨基于Tkinter+MySQL的梅西生涯数据管理系统 | https://want595.blog.csdn.***/article/details/130995564 |
5 | Web实战丨基于Django与Bootstrap的在线计算器 | https://want595.blog.csdn.***/article/details/134424381 |
6 | Web实战丨基于django+html+css的在线购物商城 | https://want595.blog.csdn.***/article/details/135466052 |
7 | Web实战丨基于django+html+css+js的电子商务网站 | https://want595.blog.csdn.***/article/details/135506809 |
8 | Web实战丨基于Django与HTML的用户登录验证系统 | https://want595.blog.csdn.***/article/details/135513413 |
9 | Web实战丨基于django+html+css+js的学院门户网站 | https://want595.blog.csdn.***/article/details/135511066 |
10 | Web实战丨基于Django与HTML的新闻发布系统 | https://want595.blog.csdn.***/article/details/135519824 |
11 | Web实战丨基于django+html+css+js的在线博客网站 | https://want595.blog.csdn.***/article/details/135536765 |
12 | …… |
写在后面
我是一只有趣的兔子,感谢你的喜欢!