前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战篇-论坛模型层

Django实战篇-论坛模型层

作者头像
小团子
发布2019-07-18 15:37:41
5730
发布2019-07-18 15:37:41
举报
文章被收录于专栏:数据云团数据云团
  • 在创建项目前需要配置 Python 虚拟环境

python 虚拟环境 virtualenv

  • 首先创建 Django 项目,可以将项目命名为 Boards。

如果是在虚拟机中创建项目,切换到对应的虚拟环境,再执行 django-admin.py startproject my_project(项目名)。

框架篇-Django博客应用-创建项目

  • 安装项目需要的第三方库;进入项目虚拟环境,pip install 模块名/包名

Django 框架

widget-tweaks 用于 BootStrop 表单渲染

  • 创建项目后,需要在项目的 settings.py 文件中修改部分配置。

① 找到 ALLOWED_HOSTS,在列表中配置访问地址;'*' 表示不限制访问地址。

② 将全局的语言配置改成中文,时区改成上海。

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

③ 在 INSTALLED_APPS 中配置 第三方应用模块 widget-tweaks。

  • 项目创建 和 settings.py 配置完成后。然后在项目下,再创建一个用户应用,可以命名为 accounts;再创建一个论坛应用,可以命名为 board。

如果是在虚拟机中创建应用,需要切换到项目的 manage.py 文件路径下,并且需要在虚拟环境下,来执行 python manage.py startapp my_app(应用名)。

完成以上操作后,就可以来设计 论坛的 model 模型。

论坛模型分为版块、话题、贴子。

  • 版块由管理员创建
  • 话题由平台用户发起
  • 帖子用作平台用户交流

① 论坛版块 Board

每个版块就像一个分类,在指定的版块里面,用户可以通过创建新话题 Topic 讨论,其它用户参与讨论回复。

代码语言:javascript
复制
import math
from django.db import models
from django.contrib.auth.models import User
from django.utils.text import Truncator
from django.utils.html import mark_safe
from markdown import markdown
代码语言:javascript
复制
class Board(models.Model):
    # 版块名称
    name = models.CharField(max_length=30, unique=True)
    # 简要描述
    description = models.CharField(max_length=100)

    def __str__(self):
        return self.name
    # 统计话题回复数
    def get_posts_count(self):
        return Post.objects.filter(topic__board=self).count()
    # 返回最后一个话题
    def get_last_post(self):
        return Post.objects.filter(topic__board=self).order_by('-created_at').first()

② 论坛话题 Topic

版块(Board)与话题(Topic)是一对多关系。一个版块下面可能与许多个或者0个 话题关联。

而话题是由用户创建,所以一个 Topic 必须有一个且只有一个 User 关联。

代码语言:javascript
复制
class Topic(models.Model):
    # 话题
    subject = models.CharField(max_length=255)
    # 最后创建时间
    last_updated = models.DateTimeField(auto_now_add=True)
    # 关联的版块
    board = models.ForeignKey(Board, related_name="topics", on_delete=models.SET_NULL, null=True)
    # 关联的用户
    starter = models.ForeignKey(User, related_name="topics", on_delete=models.SET_NULL, null=True)
    # 浏览量
    views = models.PositiveIntegerField(default=0)

    def __str__(self):
        return self.subject
        
    # 通过外键关联,对话题下的帖子进行分页
    def get_page_count(self):
        count = self.posts.count()
        pages = count / 20
        return math.ceil(pages)

    def has_many_pages(self, count=None):
        if count is None:
            count = self.get_page_count()
        return count > 6

    def get_page_range(self):
        count = self.get_page_count()
        if self.has_many_pages(count):
            return range(1, 5)
        return range(1, count + 1)

    # 限制在最近的十个回复
    def get_last_ten_posts(self):
        return self.posts.order_by('-created_at')[:10]

③ 论坛回帖 Post

  • 发起话题,同时会发布一个帖子,一个 Topic 至少有一个 Post;而一个 Post 必须与一个并且只有一个 Topic 相关联。
  • Post 必须有一个并且只有一个与之关联的用户。
  • 一个用户可能有很多或没有回帖。
代码语言:javascript
复制
# 外键关联 下一级的数据表绑定上一级
class Post(models.Model):
    # 回复的帖子 
    message = models.TextField(max_length=4000)
    # 关联的话题
    topic = models.ForeignKey(Topic, related_name="posts", on_delete=models.CASCADE, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(null=True)
    # 回帖的用户
    created_by = models.ForeignKey(User, related_name="posts", on_delete=models.CASCADE, null=True)
    # related_name="+" 在修改回帖并保存中,忽略是谁在修改
    updated_by = models.ForeignKey(User, null=True, related_name="+", on_delete=models.CASCADE)

    def __str__(self):
        truncated_message = Truncator(self.message)
        return truncated_message.chars(30)
    # markdown
    def get_message_as_markdown(self):
        return mark_safe(markdown(self.message, safe_mode='escape'))
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档