前言:
这是我第一次写博客,虽然我的博客园账号已经创建的5个月了。这种感觉就好像我创建于1998年,但是在2018年1月18号我才用python写下第一句代码:“hello,world”一样。
word less,do more。让我们开始进入正题。
前提:
首先我们先来明确我们写一个项目的流程是什么:
1. 搞清楚需求(产品经理提出)
#你要花很多时间和产品经理讨论这个事,不能南辕北辙
2. 设计表结构
#把项目所有的功能的表结构都设计出来。
#如果你实现一个功能设计一张表,那么一个月后你突然发现这张表和前面的有冲突,然后这张表你又必须得要,那么前面的内容就得推倒重做了。
#所以说你一定要高瞻远瞩,格局放到最高,然后一步一步弄清楚细节,最后再去实现。
3. 按每一个功能进行开发。
4. 功能测试(每个企业会有专门的测试岗位)
5. 项目部署上线(放去服务器,这个我们最后会讲)
#我们现在只需要做到第三步就可以了。
第一步:搞清楚需求
(1) 登录验证:基于用户认证组件和Ajax来实现登录验证(图片验证码)
(2) 注册功能:基于forms组件和Ajax实现注册功能
(3) 分页:设计系统首页,完成文章列表渲染
(4) 设计个人站点页面(ORM查询:练习分组和多表查询的)
(5) 文章详情页
(6) 实现点赞功能
(7) 实现文章的评论(文章的评论,评论的评论)
(8) 后台管理页面
(9) 副文本编辑框和防止xss攻击(防止用户恶意评论导致用户安全受威胁)
第二步:设计表结构
图例:
代码展示:
1 from django.db import models 2 3 # Create your models here. 4 from django.contrib.auth.models import User,AbstractUser 5 6 class UserInfo(AbstractUser): 7 '''用户信息表''' 8 id = models.AutoField(primary_key=True) 9 telephone = models.CharField(max_length=11,null=True,unique=True) 10 avatar = models.FileField(upload_to='avatars/',default="/avatars/default.png") 11 create_time = models.DateTimeField(verbose_name="创建时间",auto_now_add=True) 12 blog = models.OneToOneField(to="Blog",to_field="id",null=True,on_delete=models.CASCADE) 13 14 def __str__(self,on_delect=models.CASCADE): 15 return self.username 16 17 class Blog(models.Model): 18 "博客信息表(站点表)" 19 id = models.AutoField(primary_key=True) 20 title = models.CharField(verbose_name="个人博客标题",max_length=64) 21 site_name = models.CharField(verbose_name="站点名称",max_length=64) 22 theme = models.CharField(verbose_name="博客主题",max_length=32) 23 24 def __str__(self): 25 return self.title 26 27 class Category(models.Model): 28 "博主个人文章分类表" 29 id = models.AutoField(primary_key=True) 30 title = models.CharField(verbose_name="分类标题",max_length=32) 31 blog = models.ForeignKey(verbose_name="所属博客",to="Blog",to_field="id",on_delete=models.CASCADE) 32 33 def __str__(self): 34 return self.title 35 36 class Tag(models.Model): 37 "标签表" 38 id = models.AutoField(primary_key=True) 39 title = models.CharField(verbose_name="标签名称",max_length=32) 40 blog = models.ForeignKey(verbose_name="所属博客",to="Blog",to_field="id",on_delete=models.CASCADE) 41 42 def __str__(self): 43 return self.title 44 45 class Article(models.Model): 46 "文章表" 47 id = models.AutoField(primary_key=True) 48 title = models.CharField(verbose_name="文章标题",max_length=50) 49 desc = models.CharField(verbose_name="文章描述",max_length=255) 50 content = models.TextField() 51 52 comment_count = models.IntegerField(default=0) 53 up_count = models.IntegerField(default=0) 54 down_count = models.IntegerField(default=0) 55 56 user = models.ForeignKey(verbose_name="作者",to="UserInfo",to_field="id",on_delete=models.CASCADE) 57 category = models.ForeignKey(to="Category",to_field="id",null=True,on_delete=models.CASCADE) 58 tags = models.ManyToManyField(to="Tag",through="Article2Tga",through_fields=("article","tag")) 59 60 def __str__(self): 61 return self.title 62 63 class Article2Tga(models.Model): 64 id = models.AutoField(primary_key=True) 65 article = models.ForeignKey(verbose_name="文章",to="Article",to_field="id",on_delete=models.CASCADE) 66 tag = models.ForeignKey(verbose_name="标签",to="Tag",to_field="id",on_delete=models.CASCADE) 67 68 class Meta: 69 unique_together = [("article","tag"),] 70 71 def __str__(self): 72 v = self.article.title + "---" + self.tag.title 73 return v 74 75 class ArticleUpDown(models.Model): 76 "点赞表" 77 id = models.AutoField(primary_key=True) 78 user = models.ForeignKey(verbose_name="用户",to="UserInfo",to_field="id",null=True,on_delete=models.CASCADE) 79 # user = models.ForeignKey("UserInfo",null=True) #导师这个表是这种写法,意思跟上行代码一样 80 article = models.ForeignKey(verbose_name="文章",to="Article",to_field="id",null=True,on_delete=models.CASCADE) 81 is_up = models.BooleanField(default=True) 82 83 class Meta: 84 unique_together = [("article","user"),] 85 86 class Comment(models.Model): 87 "评论表" 88 id = models.AutoField(primary_key=True) 89 user = models.ForeignKey(verbose_name="评论者",to="UserInfo",to_field="id",on_delete=models.CASCADE) 90 article = models.ForeignKey(verbose_name="评论文章",to="Article",to_field="id",on_delete=models.CASCADE) 91 create_time = models.DateTimeField(verbose_name="创建时间",auto_now_add=True) 92 content = models.CharField(verbose_name="评论内容",max_length=255) 93 94 # parent_comment = models.ForeignKey("self",null=True) #导师是这样写的 95 parent_comment = models.ForeignKey(verbose_name="父级评论",to="Comment",to_field="id",null=True,on_delete=models.CASCADE) 96 97 def __str__(self): 98 return self.content
提醒:你在写这个UserInfo表的时候是把原先的Django自带的django-user表替代了,但是你要告诉Django一声,所以我们需要在settings中进行配置。
1 DATABASES = { 2 'default':{ 3 'ENGINE':'django.db.backends.mysql', 4 'NAME':'blog', #要连接的数据库,连接前需要创建好 5 'USER':'root', #连接数据库的用户名 6 'PASSWORD':'123', #连接数据库的密码 7 'HOST':'127.0.0.1', #连接主机,默认本级 8 'PORT':3306, #端口 默认3306 9 } 10 } 11 AUTH_USER_MODEL = "blog.UserInfo"
第三步:功能实现
说明:关于这部分,我目前还没有去实现,所以以后进行补充