python 虚拟环境 virtualenv
如果是在虚拟机中创建项目,切换到对应的虚拟环境,再执行 django-admin.py startproject my_project(项目名)。
框架篇-Django博客应用-创建项目
Django 框架
widget-tweaks 用于 BootStrop 表单渲染
① 找到 ALLOWED_HOSTS,在列表中配置访问地址;'*' 表示不限制访问地址。
② 将全局的语言配置改成中文,时区改成上海。
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
③ 在 INSTALLED_APPS 中配置 第三方应用模块 widget-tweaks。
如果是在虚拟机中创建应用,需要切换到项目的 manage.py 文件路径下,并且需要在虚拟环境下,来执行 python manage.py startapp my_app(应用名)。
完成以上操作后,就可以来设计 论坛的 model 模型。
论坛模型分为版块、话题、贴子。
① 论坛版块 Board
每个版块就像一个分类,在指定的版块里面,用户可以通过创建新话题 Topic 讨论,其它用户参与讨论回复。
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
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 关联。
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
# 外键关联 下一级的数据表绑定上一级
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'))