一、功能需求分析

1、banner

2、推荐文章列表

3、文章标签导航

4、文章列表

5、分页

二、模型设计

根据功能分析,我们需要如下表,大量的经验和功能积累

1、表和字段分析

a 文章分类表

b 文章表

c 文章评论表

d 推荐文章表

e 轮播图表

2、模型定义

定义一个基类模型,抽取公共字段

创建时间、更新时间、逻辑删除

a 分析每个表功能、根据字段编写模型代码

三、文章标签导航功能

1.接口设计

类目          说明

请求方式        GET

url            /

参数说明        无参数

2.返回结果

返回新闻页面,直接在模版渲染

#insert news tag data

INSERT INTO tb_tag(name, create_time, update_time, is_delete) values

('Python基础', now(), now(), 0),

('Python高级', now(), now(), 0),

('Python函数', now(), now(), 0),

('PythonGUI', now(), now(), 0),

('Linux教程', now(), now(), 0),

('Python框架', now(), now(), 0);

四、新闻列表功能

1、业务流程分析

a 判断前端传递标签分类ID是否为空,是否为整数,是否超过范围

b 判断前端传递当前文章页数是否为空,是否为整数,是否超过范围

2、接口设计

类目          说明

请求方式        GET

url           /news/

参数说明:

参数名    类型    是否必须      描述

tag      整数      否        标签分类ID

page     整数      是        当前文章页数

3、返回结果:

json

{

"errno": "0",

"errmsg": "",

"data": {

"total_pages": 61,

"news": [

{

"digest": "在python用import或者from...import或者from...import...as...来导入相应的模块,作用和使用方法与C语言的include头文件类似。其实就是引入...",

"title": "import方法引入模块详解",

"author": "python",

"image_url": "/media/jichujiaochen.jpeg",

"tag_name": "Python基础",

"update_time": "2018年12月17日 14:48"

},

{

"digest": "如果你原来是一个php程序员,你对于php函数非常了解(PS:站长原来就是一个php程序员),但是现在由于工作或者其他原因要学习python,但是p...",

"title": "给曾经是phper的程序员推荐个学习网站",

"author": "python",

"image_url": "/media/jichujiaochen.jpeg",

"tag_name": "Python基础",

"update_time": "2018年12月17日 14:48"

}

]

}

}

mysql -u root -p -D tzpj < tb_news_20181217.sql. 导入数据库

news/modile.py代码

from django.db import models

from utils.models import BaseModel

class Tag(BaseModel):

"""

文章分类标签模型

"""

# 字段

name = models.CharField('标签名', max_length=64, help_text='标签名')

class Meta:

ordering = ['-update_time', '-id'] #排序

db_table = "tb_tag" #指明数据库表名

verbose_name = '文章标签' #在admin站点中显示点名称

verbose_name_plural = verbose_name #显示点复数名称

def __str__(self):

return self.name

class News(BaseModel):

"""

文章模型

"""

title = models.CharField('标题', max_length=150, help_text='标题')

digest = models.CharField('摘要', max_length=200, help_text='摘要')

content = models.TextField('内容', help_text='内容')

clicks = models.IntegerField('点击量', default=0, help_text='点击量')

image_url = models.URLField('图片url', default='', help_text='图片url')

tag = models.ForeignKey('Tag', on_delete=models.SET_NULL, null=True)

author = models.ForeignKey('user.User', on_delete=models.SET_NULL, null=True)

class Meta:

ordering = ['-update_time', '-id'] #排序

db_table = "tb_news" #指明数据库表名

verbose_name = '新闻' #在admin站点中显示点名称

verbose_name_plural = verbose_name #显示点复数名称

def __str__(self):

return self.title

class Comments(BaseModel):

"""

评论模型

"""

content = models.TextField('内容', help_text='内容')

author = models.ForeignKey('user.User', on_delete=models.SET_NULL, null=True)

news = models.ForeignKey('News', on_delete=models.CASCADE)

class Meta:

ordering = ['-update_time', '-id'] #排序

db_table = "tb_comments" #指明数据库表名

verbose_name = '评论' #在admin站点中显示点名称

verbose_name_plural = verbose_name #显示点复数名称

def __str__(self):

return '<评论{}>'.format(self.id)

class HotNews(BaseModel):

"""

推荐文章模型

"""

news = models.OneToOneField('News', on_delete=models.CASCADE)

priority = models.IntegerField('优先级', help_text='优先级')

class Meta:

ordering = ['-update_time', '-id'] #排序

db_table = "tb_hotnews" #指明数据库表名

verbose_name = '热门文章' #在admin站点中显示点名称

verbose_name_plural = verbose_name #显示点复数名称

def __str__(self):

return '<热门文章{}>'.format(self.id)

class Banner(BaseModel):

"""

轮播图

"""

image_url = models.URLField('轮播图', help_text='轮播图url')

priority = models.IntegerField('优先级', help_text='优先级')

news = models.OneToOneField('News', on_delete=models.CASCADE)

class Meta:

ordering = ['priority', '-update_time', '-id'] #排序

db_table = "tb_banner" #指明数据库表名

verbose_name = '热门文章' #在admin站点中显示点名称

verbose_name_plural = verbose_name #显示点复数名称

def __str__(self):

return '<轮播图{}>'.format(self.id)

news/views.py代码

import logging

from django.shortcuts import render

from django.views import View

from django.db.models import F

from django.core.paginator import Paginator

from .models import Tag, News

from . import constants

from utils.res_code import json_response

logger = logging.getLogger('django')

def index(request):

"""

新闻首页视图 only默认带ID

url: /

:param request:

:return:

"""

# 新闻标签

tags = Tag.objects.only('name').filter(is_delete=False)

return render(request, 'news/index.html', context={

'tags': tags

})

class NewsListView(View):

"""

新闻列表视图

"""

def get(self, request):

# 1,获取参数

try:

tag_id = int(request.GET.get('tag', 0))

except Exception as e:

logger.error('标签错误, {}'.format(e))

tag_id = 0

try:

tag_id = int(request.GET.get('tag', 0))

except Exception as e:

logger.error('标签错误, {}'.format(e))

tag_id = 1

# 2,获取查询集 values返回字典

news_queryset = News.objects.values('id', 'title', 'digest','image_url', 'update_time',

'tag__name', 'author__username').annotate(tag_name=F('tag_name'),author=F('author__username'))

#过滤

# if tag_id:

# news = news_queryset.filter(is_dalete=False, tag_id=tag_id)

# else:

# news = news_queryset.filter(is_dalete=False)

news = news_queryset.filter(is_dalete=False, tag_id=tag_id) or news_queryset.filter(is_dalete=False)

# 3,分页

paginator = Paginator(news, constants.PER_PAGE_NEWS_COUNT)

#获取当前页数据 get_page可以容错

news_info = paginator.get_page(page)

# 4,返回数据

data = {

'total_pages': paginator.num_pages,

'news': list(news_info)

}

return json_response(data=data)

序列化:把特定的内存对象转化成可以存储的字符串

utils/res_code.py代码

import datetime

from django.http import JsonResponse

from django.core.serializers.json import DjangoJSONEncoder

class MyJSONEncoder(DjangoJSONEncoder):

def default(self, o):

if isinstance(o, datetime.datetime):

return o.astimezone().strftime('%Y-%m-%d %H:%M:%S') #转换为本地时间

else:

return super().default(o)

def json_response(errno=Code.OK, errmsg='', data=None, kwargs=None):

json_dict = {

'errno': errno,

'errmsg': errmsg,

'data': data

}

if kwargs and isinstance(kwargs, dict):

json_dict.update(kwargs)

return JsonResponse(json_dict, encoder=MyJSONEncoder)

五、推荐新闻

1,接口设计

类目          说明

请求方式        GET

url            /

参数说明        无参数

2,返回结果

返回新闻页面,直接在模版渲染

news/vies.py代码

def index(request):

"""

新闻首页视图

url: /

"""

# 新闻标签

tags = Tag.objects.only('name').filter(is_delete=False)

# 热门新闻 objects.select_related('news')一次性从数据库多拿数据

hot_news = HotNews.objects.select_related('news').only('news__title', 'news__image_url', 'news_id').filter(is_delete=False).order_by('priority', '-news__clicks')[:constants.SHOW_HOTNEWS_COUNT]

return render(request, 'news/index.html', context={

'tags': tags,

'hot_news': hot_news

})

六、轮播图功能

接口设计

1,接口说明:

类目        说明

请求方法      GET

url定义      /news/banners/

参数格式      无参数

2,返回结果: # json

{

'erron': '0',

'errmsg': 'ok'

'data': {

'banners':[

{

'image_url':'/media/jichujiaochen.jpeg',

'news_id': 221,

'news_title': 'python算法快速排序'

},

{

'image_url':'/media/python_advanced.jpeg',

'news_id': 707,

'news_title': 'python序列与映射的解包操作'

}

]

}

}

python官网 中文版 新闻-新闻主页 - python兵者 - 博客园相关推荐

  1. python官网下载步骤win10-win10系统python安装教程

    其他相关 win10系统,python安装,python_百度搜索if(window.bds&&bds.util&&bds.util.setContainerWidth ...

  2. python官网下载步骤linux-linux 安装 python 最全教程

    环境:centos6.5 centos6.5 自带的 python 版本是 2.6.6,需要重新安装 2.7: centos7 自带的 python 版本是 2.7.5 基本操作 在安装新版本之前,一 ...

  3. python官网 中文版 新闻-小伙Python爬虫并自制新闻网站,太好玩了

    作者:豆腐 来源:凹凸数据 大家好,我又来了,我是银牌厨师豆腐! 我们总是在爬啊爬,爬到了数据难道只是为了做一个词云吗? 当然不!这次我就利用flask为大家呈现一道小菜. Flask是python中 ...

  4. python官网 中文版-python .. 官方教程中文版.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspPython python .. 官方教程中文版.pdf105页 ...

  5. python官网下载步骤手机-手机python下载

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 说明: python 2python 3都支持. 示例代码 说明: 所有 ...

  6. python官网下载手机版步骤-Python

    Python是一款通用型的计算机程序设计语言,Python对编程人员来说是一款非常有利的工具,可以让您快速编写代码,而且代码运行速度非常快.Python具有非常简捷而清晰的语法特点,适合完成各种高层任 ...

  7. python官网下载步骤64位-Python 3.7 64位下载

    python64位是一种面向对象.直译式计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定.这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可 ...

  8. python官网下载步骤2019-2019年python入门到精通(19天全)

    讲解方式: python编程入门,针对0基础就python语言基础语法的各个点逐步讲解,由浅入深,通俗易懂,层层深入. 课程亮点: 1,对于编程0基础的同学或者想把python作为第二门编程语言的同学 ...

  9. python官网下载步骤图解-最新Python安装图文教程[很详细]

    如今,Python已经成为一种非常主流的编程语言了,很多小伙伴都开学习python,但是对于刚刚接触python的纯小白来说,不太会安装,下面我们就介绍介绍python最新安版本3.7.4的安装教程. ...

  10. 人工智能python框架_Python 与 AI 智能框架 - 随笔分类 - Hopesun - 博客园

    摘要:ODOO模块网 :http://www.odoomk.com/partner 官方用户手册:https://www.odoo.com/documentation/user/13.0/zh_CN/ ...

最新文章

  1. Linux 网络编程—— libpcap 详解
  2. HTTPS Web配置举例
  3. jquery-easyui环境的搭建及测试
  4. 修改主机名hosts
  5. linux默认归档目录,Linux系统管理(第4章:目录和文件管理二)
  6. 二叉树题目----1 前序中序后序遍历二叉树并返回相应的遍历(不是打印)
  7. mongodb不等于某个值_MongoDB的安装以及基本增删改查命令
  8. redis集群添加master节点
  9. dsge模型难做吗_百度Seo优化好做吗,现在做是不是越来越难做?
  10. 一个简单的C#委托小例子
  11. Page_PreRender正好用来做View
  12. 解决contenteditable内自动生成font标签问题
  13. Hbuilder连接苹果手机
  14. leetcode题解日练--2016.8.29
  15. 实现WinForm的DataGridView折叠功能(非原创,仅供收藏)
  16. 使用async.whilst要注意的地方
  17. 【电商吧 - 1】一文带你梳理支付宝支付时用到的加密规则
  18. html表格按照编号排序,JS实现简单表格排序操作示例
  19. 具有生物启发训练方法的物理深度学习:物理硬件的无梯度方法
  20. ppt中加入html,如何在ppt中插入html网页.ppt

热门文章

  1. 图解Google Android内核编译教程
  2. mysql 使用EF6.0CodeFirst
  3. 总结20121016
  4. 清华大学计算机系网络教学视频31门计算机课程
  5. all index range ref eq_ref const system 索引type说明
  6. 你注意到 .Net Framework 和 .Net Core 中使用 Session 的区别了吗?
  7. 数据结构 - 静态单链表的实行(C语言)
  8. Binary Tree Preorder Traversal
  9. 几个经典的TCP通信函数
  10. python图片识别-Python+Opencv识别两张相似图片