Django项目: 5.新闻主页

一、功能需求分析

1.功能

  1. 轮播图
  2. 推荐文章列表
  3. 文章标签导航
  4. 文章列表
  5. 分页

二、模型设计

根据功能分析,我们需要如下表

1.表和字段分析

  1. 文章分类表
  2. 文章表
  3. 文章评论表
  4. 推荐文章表
  5. 轮播图表

2.模型定义

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

# 在utils目录下,创建一个models.py文件,在其中定义一个基类模型
from django.db import models

class BaseModel(models.Model):
    """
    基类,公共字段
    """
    create_time = models.DateTimeField(‘创建时间‘, auto_now_add=True)
    update_time = models.DateTimeField(‘更新时间‘, auto_now=True)
    is_delete = models.BooleanField(‘逻辑删除‘, default=False)

    class Meta:
        # 抽象类,用于继承,迁移时不会创建
        abstract = True

定义其他模型

# 在news目录下的models.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(‘轮播图url‘, 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)

三、文章标签导航功能

1.接口设计

  1. 接口说明:

    类目 说明
    请求方法 GET
    url定义 /
    参数格式 无参数
  2. 返回结果

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

2.后端代码

# 在news/views.py文件中定义如下视图
from django.shortcuts import render

from .models import Tag

def index(request):
    """
    新闻首页视图
    :param request:
    :return:
    """

    tags = Tag.objects.only(‘id‘, ‘name‘).filter(is_delete=False)
    return render(request, ‘news/index.html‘,
                  context={
                      ‘tags‘: tags
                  })

导入tag测试数据,或者直接用Navicat软件在tb_tag表中添加数据(数据见下方代码中引号里的内容,共6个),,,因为前段设置的原因,必须要跟我的内容一样,后面会用到

# 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);

3.前端代码

# 修改templates/news/index.html中 news-nav部分代码如:
        <!--  news-nav start-->
          <nav class="news-nav">
              <ul class="clearfix">
                  <li class="active"><a href="javascript:void(0)">最新资讯</a></li>
                    {% for tag in tags %}
                        <li><a href="javascript:void(0)" data-id="{{ tag.id }}">{{ tag.name }}</a>
                  </li>
                    {% endfor %}
              </ul>
          </nav>
        <!--  news-nav end -->

四、新闻列表功能

1.业务流程分析

  1. 判断前端传递标签分类id是否为空,是否为整数,是否超过范围
  2. 判断前端传递当前文章页数是否为空,是否为整数,是否超过范围

2.接口设计

接口说明:

类目 说明
请求方法 GET
url定义 /news/
参数格式 查询参数

参数说明:

参数名 类型 是否必须 描述
tag 整数 标签分类id
page 整数 当前文章页数

返回结果:

{
    "errno": "0",
     "errmsg": "",
    "data": {
        "total_pages": 61,
        "news": [
            {
                ‘id‘: ‘xxx‘,
                "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"
            },
            {
                ‘id‘: ‘xxx‘
                "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"
            }
        ]
    }
}

3.后端代码

在项目根目录下创建一个media文件夹,用于存放新闻图片以及用户上传文件。

# 在settings.py文件中添加
# 媒体文件配置
MEDIA_URL = ‘/media/‘
MEDIA_ROOT = os.path.join(BASE_DIR, ‘media‘)

django在调试模式下提供静态文件服务,为了能够返回media中的媒体文件还需在根urls.py中做如下配置

# 在根urls.py中加上static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path(‘‘, include(‘news.urls‘)),
    path(‘‘, include(‘verification.urls‘)),
    path(‘user/‘, include(‘user.urls‘))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

导入测试数据,为了测试数据的导入,请确保表名一致

# 在xshell中导入测试数据,在xshell中通过rz命令,将tb_news_20181217.sql文件上传到虚拟机

mysql -u 用户名 -p -D 数据库名 < tb_news_20181217.sql

原文地址:https://www.cnblogs.com/Tmclri/p/11545227.html

时间: 2024-10-08 23:05:23

Django项目: 5.新闻主页的相关文章

Django项目实践4 - Django网站管理(后台管理员)

http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类站点, 管理界面 是基础设施中很重要的一部分. 这是以网页和有限的可信任管理者为基础的界面,它能够让你加入,编辑和删除站点内容. 常见的样例: 你能够用这个界面公布博客,后台的站点管理者用它来润色读者提交的内容,你的客户用你给他们建立的界面工具更新新闻并公布在站点上.这些都是使用管理界面的样例. 创

apache mod_wsgi 部署django项目后连接不上mysql

问题描述 做好的django项目,使用python manage.py runserver 可以正常work. 然而当将项目使用mod_wsgi部署到apache上之后却不能连接mysql.一直报错:"Internal Server Error",查看日志信息,除了"Can't connect mysql"还是连不上mysql. 追踪问题 django测试 分别在debug模式以及debug off模式下运行项目,无任何异常,足以证明项目自身配置没任何错误. Pyt

一 Django框架介绍——用pycharm创建Django项目

Django框架介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布. 这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. 更多Django框架http://code.ziqiangxuetang.com/django/django-qrcode.htm

008:第一个Django项目剖析(2)

pycharm运行项目: 使用pycharm运行项目,并运行局域网内部用户访问:主要要修改如下地方(包括修改端口),具体请看下图: 项目结构介绍: manage.py :以后和项目交互基本上都是基于这个文件.一般都是在终端输入 python  manage.py [子命令] .可以输入 python  manage.py  help 看下能做什么事情.除非你知道你自己在做什么,一般情况下不应该编辑这个文件. settings.py :本项目的设置项,以后所有和项目相关的配置都是放在这个里面. u

django项目开始

第一个Django项目 创建Django项目: 用命令行的方式: 创建项目:打开终端,使用命令:django-admin startproject [项目名称]即可创建.比如: django-admin startproject first_project 创建应用(app):一个项目类似于是一个架子,但是真正起作用的还是app.在终端进入到项目所在的路径,然后执行python manage.py startapp [app名称]创建一个app. python manage.py start a

Windows的 IIS 部署django项目

1.安装Windows的IIS 功能(win10为例): (1)进入控制面板  :选择大图标    进入程序和功能 (2)启用或者关闭Windows功能 (3)勾选需要的功能(CGI必须安装). (4)验证IIS有没有安装成功 打开浏览器   输入地址为: localhost    (出现此页面则IIS安装成功) 2.环境准备:你的django  或许使用了虚拟环境,那么部署的时候,服务器主机除了python之外,,,django框架   依赖库都要在服务器主机上安装 (1)安装 wfastcg

Django项目: 项目环境搭建 ---- 三、在码云平台创建项目&amp;推送到码云上

三.在码云平台创建项目 git服务平台: 主要使用github(最主流) 国内访问速度慢 托管私有项目收费 国内一般使用码云gitee 国内访问速度快 托管私有项目免费(限制开发人数) 公司中使用gitlab或者svn来搭建 创建步骤 1.注册码云账号注册 2.创建仓库 登录码云后,通过网站右上角的「+」号,选择「新建仓库」,进入新建仓库页面 2.填写仓库信息 3.点击「创建」,即可在码云上创建你的第一个仓库. 3.生成ssh公钥 ssh-keygen -t rsa -C '[email pro

Celery框架 接口缓存, Celery框架, Django项目实现轮播图缓存更新

接口缓存 """ 1)什么是接口的后台缓存 前台访问后台接口,后台会优先从缓存(内存)中查找接口数据 如果有数据,直接对前台响应缓存数据 如果没有数据,与(mysql)数据库交互,得到数据,对前台响应,同时将数据进行缓存,以备下次使用 了解:前台缓存 - 前台在请求到接口数据后,在前台建立缓存,再发送同样请求时,发现前台缓存有数据,就不再对后台做请求了 2)什么的接口会进行接口缓存 i)接口会被大量访问:比如主页中的接口,几乎所有人都会访问,而且会重复访问 ii)在一定时间内

linux搭建django项目基本步骤

一 linux下django基本项目搭建流程:M model 用于与数据库交互V view 接受前台请求 调用model获取结果,调用T获取页面,返回给前台T template 接受view的要求 生成一个网页给V 1 创建项目命令: django-admin startproject 项目名 2 为项目创建一个应用(django中一个应用就是一个功能模块): 在项目目录下 该目录下有一个manage.py文件 python manage.py startapp 应用名 3 安装应用,将应用与项