django2实战2.创建博客应用创建应用文章表的字段设计激活应用开启后台将post模型注册到后台自定义文章显示字段增加可选操作

继上篇 django2实战1.初识django

创建应用

上篇创建了一个项目,项目相当于站点,应用即是独立的功能模块。比如:淘宝是一个完整的网站,即是一个项目。而淘宝下的聚划算属于一个应用

在django中,一个应用是由模型、视图、模板以及url配置组成的。

创建一个blog应用

☁  mysite  python manage.py startapp blog
☁  mysite  tree blog
blog
├── __init__.py
├── admin.py # 将模型注册到站点管理后台
├── apps.py # 应用的主配置
├── migrations # 数据库迁移文件
│   └── __init__.py
├── models.py # 模型文件,每个应用都必须有一个文件文件
├── tests.py # 测试文件
└── views.py # 应用的逻辑都写在view层,包括接收http请求,处理逻辑,返回响应

1 directory, 7 files

文章表的字段设计

一个博客最重要的数据就是文章,接下来我们设计文章的字段

一篇文章的字段有:标题、摘要、作者、内容、发布时间、创建时间、更新时间、状态

数据对应的是模型,即blog的models.py

代码实现:

blog/models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Post(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'), # 草稿
        ('published', 'Published'), # 已发布
    )
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250,
                            unique_for_date='publish')
    author = models.ForeignKey(User,
                               on_delete=models.CASCADE,
                               related_name='blog_posts')
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10,
                              choices=STATUS_CHOICES,
                              default='draft')

    class Meta:
        ordering = ('-publish',) # 按发布时间倒序排列

    def __str__(self):
        return self.title

字段定义说明:

  • title: 字段定义为CharField, 对应sql中的varchar类型,max_length指定了该字段的最大长度
  • slug: url标识,文章的url格式为:yyyy/mm/dd/slug/, unique_for_date 表示slug与日期的组合是惟一的,即每篇文章的url不可重复
  • author: 文章作者,此字段是外键,与user中相关联,当user表的用户删除时,该用户发表的文章也将被删除 外键的详细说明
  • body: 文章详情,使用text类型
  • publish: 文章发布时间,默认为当前时间
  • created: 文章创建时间,auto_now_add 表示当文章创建时,会自动生成该时间
  • updated: 文章更新时间,当文章被更新时,会自动生成更新的时间
  • status: 文章状态,从STATUS_CHOICES中选取状态值

关于字段类型的更多使用,参见官方文档

激活应用

根据models.py字义的字段执行数据迁移

☁  mysite  python manage.py makemigrations blog
App 'blog' could not be found. Is it in INSTALLED_APPS?

提示找不到blog应用,这是因为每添加一个应用,都需要到settings.py中激活

mysite/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig', # 注册 blog 应用
]

生成数据库迁移文件

☁  mysite  python manage.py makemigrations blog
Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Post

执行数据迁移,此时就创建好了post数据表

☁  mysite  python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK

开启后台

进入后台的第一步是创建管理员

☁  mysite  python manage.py createsuperuser
Username (leave blank to use 'long'): admin
Email address: test@qq.com
Password:
Password (again):
Superuser created successfully.

重启webserver服务

☁  mysite  python manage.py runserver

访问 http://127.0.0.1:8000/admin

login

后台主页

admin index

将post模型注册到后台

blog/admin.py

from django.contrib import admin
from .models import Post

admin.site.register(Post)

刷新后台,便能看到post

后台post页面

点击add,添加一篇文章

add post

自定义文章显示字段

mysite/blog/admin.py

from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug', 'author', 'publish', 'status')

post显示的字段

增加可选操作

mysite/blog/admin.py

from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug', 'author', 'publish', 'status')
    list_filter = ('status', 'created', 'publish', 'author')
    search_fields = ('title', 'body')
    prepopulated_fields = {'slug': ('title',)}
    raw_id_fields = ('author',)
    date_hierarchy = 'publish'
    ordering = ('status', 'publish')

搜索栏

搜索

侧边栏过滤选项

过滤

下一节将讲解如何使用django的模型查询语句。如果你感兴趣,请关注我的django2实战文集

如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux 杂货铺

使用Apache Guacamole连接虚拟云桌面

Apache Guacamole是一款HTML5应用程序,可通过RDP,VNC和其他协议访问远程桌面。您可以创建一个虚拟云桌面,用户通过Web浏览器即可访问。本...

2.9K4
来自专栏IMWeb前端团队

WebWorker简介

本文作者:IMWeb rakuluo 原文出处:IMWeb社区 未经同意,禁止转载 为 JavaScript引入线程技术 不必再用 setTime...

2128
来自专栏Golang语言社区

gRPC服务发现&负载均衡

构建高可用、高性能的通信服务,通常采用服务注册与发现、负载均衡和容错处理等机制实现。根据负载均衡实现所在的位置不同,通常可分为以下三种解决方案:

7142
来自专栏草根专栏

使用Identity Server 4建立Authorization Server (1)

本文内容基本完全来自于Identity Server 4官方文档: https://identityserver4.readthedocs.io/ 官方文档很详...

49610
来自专栏抠抠空间

rest_framework基础

1590
来自专栏向治洪

Android 进程回收之LowMemoryKiller原理篇

在前面的文章Android进程保活一文中,对于LowMemoryKiller的概念做了简单的提及。LowMemoryKiller简称低内存杀死机制。简单来说,L...

35910
来自专栏Felix的技术分享

《一个操作系统的实现》笔记(2)--保护模式

3698
来自专栏程序员的SOD蜜

使用“消息服务框架”(MSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)

1,示例解决方案介绍 在上一篇 《消息服务框架(MSF)应用实例之分布式事务三阶段提交协议的实现》中,我们分析了分布式事务的三阶段提交协议的原理,现在我们来看看...

3279
来自专栏乐沙弥的世界

cannot set user id: Resource temporarily unavailable

    前阵子,Infra报告无法透过putty以及SecureCRT连接到数据库服务器,提示的错误为Resource temporarily unavaila...

750
来自专栏逸鹏说道

直传文件到Azure Storage的Blob服务中

题记:为了庆祝获得微信公众号赞赏功能,忙里抽闲分享一下最近工作的一点心得:如何直接从浏览器中上传文件到Azure Storage的Blob服务中。 为什么 如果...

3377

扫码关注云+社区

领取腾讯云代金券