欢迎来访我的博客。

第2章, 数据库和models设计

Django 小张哥哥 304浏览 0评论

现在需要设计一下博客网站所需要的数据表的结构。

首先,我们需要一个用户表

UserProfile:

用于保存用户信息,包括用户名,密码,全名,邮箱,电话,地址。

导航栏下的大分类(RootCategory):

包括分类名称,分类描述,以及分类关键字

导航栏每一个选项下的下拉菜单分类(Category):

同样包括分类名称,分类描述,以及分类关键字

Article

保存博客文章相关信息:

包括:标题,连接,封面图片,作者,摘要,内容,阅读量,喜爱数,创作时间,修改时间

分类,标签,关键字

标签Tag

用户保存文章的特定标签分类

关键字Keyword

用户文章搜索

 

公告Notice

标题,内容,是否已读,是否重要,发布时间

 

轮播图Banner

标题,描述,图片文件,图片连接,编号

 

友情链接表格

名称,描述,链接, 图标,编号,添加时间

 

 

现在我们在pyCharm的命令行中进入到apps文件夹下,输入命令,创建user和blog两个app

(venv) C:\Users\zhang\PycharmProjects\zcwBlog\apps>python ../manage.py startapp user

(venv) C:\Users\zhang\PycharmProjects\zcwBlog\apps>python ../manage.py startapp blog

现在文件目录如下所示:

01.png

  1.  Apps/user/UserProfile文件

我们的UserProfile类继承自AbstractUser

from django.utils import timezone
 from django.db import models
 from django.contrib.auth.models import AbstractUser
 
 
 class UserProfile(AbstractUser):
     nick_name = models.CharField(max_length=20, verbose_name='昵称')
     email = models.EmailField(verbose_name='邮箱')
     birthday = models.DateField(default=timezone.now, verbose_name='生日')
     mobile = models.CharField(max_length=11, verbose_name='手机')
     addr = models.CharField(max_length=200, verbose_name='住址')
     image = models.ImageField(upload_to='image/%Y/%m', default='image/default.jpg', verbose_name='头像')
     add_time = models.DateTimeField(default=timezone.now, verbose_name='注册时间')
 
     class Meta:
         verbose_name = '用户信息'
         verbose_name_plural = verbose_name



2.  Apps/blog/models文件

 from django.db import models
 from django.utils import timezone
 from ..user.models import UserProfile
 
 
 class RootCategory(models.Model):
     name = models.CharField(max_length=20, verbose_name='名称')
     desc = models.CharField(max_length=200, verbose_name='描述')
     keyword = models.CharField(max_length=10, verbose_name='分类关键字')
 
     class Meta:
         verbose_name = '主分类'
         verbose_name_plural = verbose_name
 
     def __str__(self):
         return self.name
 
 
 class Category(models.Model):
     name = models.CharField(max_length=20, verbose_name='名称')
     root_category = models.ForeignKey(RootCategory, verbose_name='所属主分类')
     desc = models.CharField(max_length=200, verbose_name='描述')
     keyword = models.CharField(max_length=10, verbose_name='分类关键字')
 
     class Meta:
         verbose_name = '分类'
         verbose_name_plural = verbose_name
 
     def __str__(self):
         return self.name
 
 
 class Tag(models.Model):
     name = models.CharField(max_length=20, verbose_name='名称')
     desc = models.CharField(max_length=100, verbose_name='描述')
     tag = models.CharField(max_length=20, verbose_name='标签')
 
     class Meta:
         verbose_name = '标签'
         verbose_name_plural = verbose_name
 
     def __str__(self):
         return self.name
 
 
 class Keyword(models.Model):
     name = models.CharField(max_length=20, verbose_name='名称')
     desc = models.CharField(max_length=100, verbose_name='描述')
     keyword = models.CharField(max_length=20, verbose_name='标签')
 
     class Meta:
         verbose_name = '关键字'
         verbose_name_plural = verbose_name
 
     def __str__(self):
         return self.name
 
 
 class Article(models.Model):
     category = models.ForeignKey(Category, verbose_name='分类')
     title = models.CharField(max_length=200, verbose_name='标题')
     author = models.ForeignKey(UserProfile, verbose_name='作者')
     summary = models.CharField(max_length=1000, verbose_name='摘要')
     cover_image = models.ImageField(upload_to="article/%Y/%m", verbose_name='封面图')
     url = models.CharField(max_length=200, verbose_name='链接')
     content = models.TextField(verbose_name='文章内容')
     read_num = models.IntegerField(default=0, verbose_name='阅读数')
     fav_num = models.IntegerField(default=0, verbose_name='喜爱数')
     is_banner = models.BooleanField(default=False, verbose_name='是否首页轮播')
     create_time = models.DateTimeField(default=timezone.now, verbose_name='创作时间')
     update_time = models.DateTimeField(default=timezone.now, verbose_name='更新时间')
     tags = models.ManyToManyField(Tag, verbose_name='文章标签')
     keywords = models.ManyToManyField(Keyword, verbose_name='搜索关键字')
 
     class Meta:
         verbose_name = '文章'
         verbose_name_plural = verbose_name
 
     def __str__(self):
         return self.title
 
 
 class Comment(models.Model):
     article = models.ForeignKey(Article, verbose_name='评论的文章')
     name = models.CharField(max_length=20, verbose_name='评论者姓名')
     email = models.CharField(max_length=100, verbose_name='评论者邮箱')
     comment = models.CharField(max_length=1000, verbose_name='评论内容')
     add_time = models.DateField(default=timezone.now, verbose_name='添加时间')
 
     class Meta:
         verbose_name = '评论'
         verbose_name_plural = verbose_name
 
     def __str__(self):
         return self.name
 
 
 class FriendlyLink(models.Model):
     name = models.CharField(max_length=20, verbose_name='名称')
     desc = models.CharField(max_length=100, verbose_name='描述')
     index = models.IntegerField(default=0, verbose_name='编号')
     ico = models.ImageField(upload_to='link/%Y/%m', verbose_name='图标')
     url = models.CharField(max_length=1000, verbose_name='链接')
     add_time = models.DateTimeField(default=timezone.now, verbose_name='添加时间')
 
     class Meta:
         verbose_name = '友情链接'
         verbose_name_plural = verbose_name
 
     def __str__(self):
         return self.name


现在暂时先不做富文本的支持,文章内容和评论暂时先以CharField类型保存



3.    在apps/user文件夹和apps/blog文件夹中创建apps.py文件:

from django.apps import AppConfig


class BlogConfig(AppConfig):
    name = 'blog'
    verbose_name = '博客管理'



4.    将user和blog写入到setting文件中的INSTALLED_APPS

INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'xadmin',
     'crispy_forms',
     'user',
     'blog'
 ]

由于此时我们定义了user,因此需要把settings添加如下声明:

AUTH_USER_MODEL = 'user.UserProfile'


5.     为了在后台中显示和编辑我们的数据库文件,我们还需要在每个app的页面下添加并编辑adminx.py文件

class RootCategoryAdmin(object):
     list_display = ['name', 'keyword', 'desc']
     search_fields = ['name', 'keyword', 'desc']
     list_filter = ['name', 'keyword', 'desc']
 
 
 class CategoryAdmin(object):
     list_display = ['name', 'keyword', 'root_category', 'desc']
     search_fields = ['name', 'keyword', 'root_category', 'desc']
     list_filter = ['name', 'keyword', 'root_category',  'desc']

list_display是之需要在列表页显示的字段

search_fields是可以搜索的字段

list_filter是列表页面可以进行过滤的字段

models中的其它的几个类,我们也作类似的配置。注意最后要将其注册:

xadmin.site.register(Article, ArticleAdmin)
xadmin.site.register(RootCategory, RootCategoryAdmin)
xadmin.site.register(Category, CategoryAdmin)
xadmin.site.register(Tag, TagAdmin)
xadmin.site.register(Keyword, KeywordAdmin)
xadmin.site.register(Comment, CommentAdmin)
xadmin.site.register(FriendlyLink, FriendlyLinkAdmin)


6.     先给blog写一个简单的view

from django.shortcuts import render
 from django.views import View
 
 
 class TechniqueView(View):
     def get(self, request):
         return render(request, 'technique.html', {})

直接使用render这个快捷函数


7.     urls.py文件,

为了避免最后urls文件内容太多不好管理,我们这边现在将在各个app下建立urls文件单独管理,直接在zcwBlog文件夹下的urls文件中include这些urls文件

zcwBlog.py

import xadmin
 from django.urls import path, include
 
 urlpatterns = [
     path('xadmin/', xadmin.site.urls),
     path('blog/', include('blog.urls'))
 ]

apps/blog/urls.py

from django.urls import path
 from .views import TechniqueView
 
 urlpatterns = [
     path('technique/', TechniqueView.as_view(), name='technique')
 ]


8.     现在打开127.0.0.1:8000/blog/technique/页面看一下发现能显示我们的模板页面了。

02.png


转载请注明:禅思 » 第2章, 数据库和models设计?

喜欢 (0) or 分享 (0)

我的个人微信公众号,欢迎关注

扫码或搜索:Python后端开发Django

Python后端开发Django

微信公众号 扫一扫关注

结交朋友、一起学习,一起进步。

科波之主

QQ号 386046154 立即加入

添加微信,进行技术交流

专注技术交流, 一同成长进步

我的微信号

如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(0)个小伙伴在吐槽