zoukankan      html  css  js  c++  java
  • 【1】网站搭建:模型设计

    一、前言

      网站已经成功部署好多天了,今天突然发现以前在开发过程中遇到的问题没有被好好的记录下来,或者说是没有被保存。这样肯定是不可取的,这会让我陷入问题的轮回中,重复思考着如何解决一个问题,那就太花费时间和精力了。所以,现在就尽可能地恢复一些记忆和还原当时做网站的经历,日后肯定会感谢今天的自己。

    二、模型设计

      首先一些基础知识如创建虚拟环境,创建项目已经在之前写过的Django入门里面详细介绍了,具体可以参照Django入门: (第一天) 开发环境,这里就直接进入主题-模型设计。

      模型设计也就是对需求的满足,想要实现什么功能,模型就得怎么设计,因为我制作的是个人网站,所以我的设计应该是包含:

        1) 文章的标题文章的正文。

        2)文章的发表时间。

        3)文章的修改时间。

        4)文章的摘要。

        5)文章的分类。

        6)文章的作者。

      为减少查询数据集的负担,需要将文章的分类和文章的作者作为外键引用,其代码如下:

    class Category(models.Model):
        """
            Django 要求模型必须继承 models.Model 类。
            Category 只需要一个简单的分类名 name 就可以了。
            CharField 指定了分类名 name 的数据类型,CharField 是字符型,
            CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
        """
        name = models.CharField(u'分类', max_length=20)
    
         class Meta:
            verbose_name = '分类'
            verbose_name_plural = '分类'
    
            def __str__(self):
    
                return self.name            

      而Django自身提供了一个User类,可以直接引用这个外键,所以可不必另外建一个模型类。

      models代码如下:

    from django.db import models
    from django.contrib.auth.models import User  # 引入USER
    
    
    class Category(models.Model):
        """
            Django 要求模型必须继承 models.Model 类。
            Category 只需要一个简单的分类名 name 就可以了。
            CharField 指定了分类名 name 的数据类型,CharField 是字符型,
            CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
        """
        name = models.CharField(u'分类', max_length=20)
    
        class Meta:
            verbose_name = '分类'
            verbose_name_plural = '分类'
    
        def __str__(self):
    
            return self.name
    
    class Post(models.Model):  
        """
            文章的数据库表稍微复杂一点,主要是涉及的字段更多。
        """
    
        # 文章标题
        # u'文章标题'可以在后台显示里面的字段名
        title = models.CharField(u'文章标题', max_length=70)
    
        # 文章正文,我们使用了 TextField。
        # 存储比较短的字符串可以使用 CharField,但对于文章的正文来说可能会是一大段文本,因此使用 TextField 来存储大段文本。
        body = TextField()
    
        # 这两个列分别表示文章的创建时间和最后一次修改时间,存储时间的字段用 DateTimeField 类型。
        # auto_now_add=True时间可以被确定为现在的时间,不需要在后台对该字段名进行操作
        created_time = models.DateTimeField(u'创建时间', auto_now_add=True)
        modified_time = models.DateTimeField(u'修改时间', auto_now_add=True)
    
        # 文章摘要,可以没有文章摘要,但默认情况下 CharField 要求必须存入数据,否则就会报错。
        # 指定 CharField 的 blank=True 参数值后就可以允许空值了。
        # excerpt = models.CharField(u'摘要', max_length=200, blank=True)
        # 这里我把摘要注释了,因为每次都要输入摘要很麻烦,后面可以直接模板中采用过滤器truncatechars可自由提取文章前规定字数
    
        # 这是分类,分类的模型已经定义在上面。
        # 这里把文章对应的数据库表和分类、标签对应的数据库表关联了起来,但是关联形式稍微有点不同。
        # 规定一篇文章只能对应一个分类,但是一个分类下可以有多篇文章,所以使用的是 ForeignKey,即一对多的关联关系。
        # 而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以使用 ManyToManyField,表明这是多对多的关联关系。
        # 文章可以没有标签,因此为标签 tags 指定了 blank=True。
    
        category = models.ForeignKey(Category)
    
        # 文章作者,这里 User 是从 django.contrib.auth.models 导入的。
        # django.contrib.auth 是 Django 内置的应用,专门用于处理网站用户的注册、登录等流程,User 是 Django已经写好的用户模型。
        # 通过 ForeignKey 把文章和 User 关联了起来。
        # 规定一篇文章只能有一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。
        # on_delete=models.CASCADE表示级联删除
        author = models.ForeignKey(User, on_delete=models.CASCADE)
    
        def __str__(self):
    
            return self.title
    
        class Meta:
            verbose_name = '文章'
            verbose_name_plural = '文章'
            ordering = ['-modified_time']

    三、模型注册

      这个时候虽然已经把模型定下来了,但是注意要将该应用注册到seetings中,然后使用python manage.py createsuperuser创建一个超级用户,然后在admin.py加入以下代码,就可以在后台显示了。

    from django.contrib import admin
    from .models import Category, Post 
    # 自定义
    @admin.register(Category)
    class CategoryAdmin(admin.ModelAdmin):
        """
            作用:自定义分类管理工具
            admin.ModelAdmin:继承admin.ModelAdmin类
        """
        # 在后台显示id值和分类名
        list_display = ('id', 'name')
    
    @admin.register(Post)
    class PostAdmin(admin.ModelAdmin):
        """
            作用:自定义文章管理工具
            admin.ModelAdmin:继承admin.ModelAdmin类
        """
        # 在后台显示id值,博文名,创建时间,修改时间,目录,作者
        list_display = ('id', 'title', 'created_time', 'modified_time', 'category', 'author')    
        # 增加过滤框,且以文章分类作过滤器
        list_filter = ['category']
        # 增加文章标题搜索字段
        search_fields = ['title']
        # 后台管理每页显示20篇文章标题
        list_per_page = 20

      原文出处:https://jzfblog.com/detail/18,文章的更新编辑以此链接为准。欢迎关注源站文章!

    作者:蒋振飞
    此内容均来自个人原创以及互联网转载和摘录,仅供学习交流使用,并非商业用途,欢迎转载。
  • 相关阅读:
    Kafka学习笔记之kafka高版本Client连接0.9Server引发的血案排查
    机器学习笔记之python实现朴素贝叶斯算法样例
    机器学习笔记之python实现支持向量机SVM算法样例
    机器学习笔记之AdaBoost算法详解以及代码实现
    机器学习笔记之python实现关联规则算法Apriori样例
    机器学习笔记之python实现AdaBoost算法
    F-47(copy 邓大顾)
    js 设置标题 空白
    微信授权验证
    iphone web 时间 问题
  • 原文地址:https://www.cnblogs.com/djcoder/p/10726096.html
Copyright © 2011-2022 走看看