小酌Django2——博客文章发布

Blog应用:博客文章发布

编写数据模型类

设计数据库和表结构是做网站的基础;在Django中,不需要通过SQL直接跟数据交互,而是完全用Python的方式创建数据模型,之后交给Django完成数据库操作;

  • 利用Django开发网站,一般需要先编写数据模型:就是在./blog/models.py中写一个类BlogArticles
  • 该类与数据库中的数据表具有对应关系;

BlogArticles类:

  • 本质继承自django.db.models.Model
  • 类型定义的属性对应着数据库表的一个字段;
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import Userclass BlogArticles(models.Model):title = models.CharField(max_length=300) #author = models.ForeignKey(User, related_name="blog_posts") # 外键来自User,表示用户、文章 一对多的关系;related_name="blog_posts"作用是允许通过User类反向查找到BlogArticles;body = models.TextField()publish = models.DateTimeField(default=timezone.now)class Meta: # 与元类不同ordering = ("-publish",) # 规定BlogArticles实例对象按publish字段值倒序显示;def __str__(self):return self.title

根据数据模型类建立数据库

  • 先根据数据模型类创建模型;
  • 在基于模型建立数据库;

创建模型

  • 请先确认已经在mysite1目录下的settings.py中注册blog应用;
  • 在根目录下,执行python manage.py makemigrations(记得先执行下ls);创建存储应用的数据库表结构的指令的文件;

这里报了一个错误:

TypeError: __init__() missing 1 required positional argument: 'on_delete'

原因:

django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数;

 on_delete=None,               # 删除关联表中的数据时,当前表与其关联的field的行为on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)on_delete=models.SET_NULL,    # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)on_delete=models.SET,         # 删除关联数据,a. 与之关联的值设置为指定值,设置:models.SET(值)b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

这里我们使用关联删除:on_delete=models.CASCADE

修改代码如下:

author = models.ForeignKey(User, related_name="blog_posts", on_delete=models.CASCADE
)

重新执行上述命令:

$ ls
blog            db.sqlite3      manage.py       mysite1
$ python manage.py makemigrations
Migrations for 'blog':blog/migrations/0001_initial.py- Create model BlogArticles

现在,在blog/migrations 目录下我们通过执行makemigrations命令自动创建了一个BlogArticles 模型:0001_initial.py

# Generated by Django 3.0.8 on 2020-07-07 11:06from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezoneclass Migration(migrations.Migration):initial = Truedependencies = [migrations.swappable_dependency(settings.AUTH_USER_MODEL),]operations = [migrations.CreateModel(name='BlogArticles',fields=[('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),('title', models.CharField(max_length=300)),('body', models.TextField()),('publish', models.DateTimeField(default=django.utils.timezone.now)),('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='blog_posts', to=settings.AUTH_USER_MODEL)),],options={'ordering': ('-publish',),},),]

这段代码的含义可以使用命令python manage.py sqlmigrate blog 0001查看:

  • sql语句显示:上述代码创建了一个名为blog_blogarticles的数据库表,blog是应用名,blogarticles是模型类名称全小写;
  • 这实际就是一个能够建立数据库表的文件,基于此就可以进行后续数据库的创建;
$ python manage.py sqlmigrate blog 0001
BEGIN;
--
-- Create model BlogArticles
--
CREATE TABLE "blog_blogarticles" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(300) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_blogarticles_author_id_ed798e23" ON "blog_blogarticles" ("author_id");
COMMIT;

创建数据库

  • 执行命令python manage.py migrate创建数据库;
$ python manage.py migrate
Operations to perform:Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:Applying blog.0001_initial... OK

现在,使用Navicat Premium打开根目录下的数据库文件,查看相应的数据库表结构,就可以看见已经创建好的表blog_blogarticles:

发布博客文章

最简单的发布——使用Django默认的管理功能发布文章;要使用此方法需要先创建超级管理员(创建后牢记用户名和密码);

创建超级管理员

  • 使用命令python manage.py createsuperuser
$ python manage.py createsuperuser
Username (leave blank to use 'huaqiang'): baby_hua
Email address: xxx_xxxxx_xxx@163.com
Password: h1-8
Password (again):
Superuser created successfully.
  • 运行项目,使用命令python manage.py runserver
  • 访问http://127.0.0.1:8000/admin/
  • 使用超级管理员登录;

这里:

  • Groups和Users是Django在用户管理应用中默认的;单击Users就能看见目前唯一的用户baby_hua;
  • 可以尝试进行用户的操作;

编辑blog/admin.py 注册Blog

还记得blog/admin.py文件的作用吗:

  • 可在此文件中,自定义Django管理工具,如设置在管理界面能够管理的项目,或通过重新自定义与系统管理有关的类对象,向管理功能增加新的内容;

编辑blog/admin.py:

from django.contrib import admin# Register your models here.from .models import BlogArticles  # 引入BlogArticles类admin.site.register(BlogArticles)  # 在admin中注册该类

保存后查看项目:(未添加新文件,无需重启)

我们看到了一个新注册的BLOG:

  • 尝试多添加几个博客文章;可以看到新建博客文章编辑的信息与BlogArticles类中属性是一致的;
  • 再查看数据库,可以看到刚刚新建文章的多条记录;BlogArticles类中ForeignKey()属性也起了作用,author_id被赋了相应的值(auth_user表的主键id);

提供时区数值:blog/models.py中使用的django.utils.timezone,依赖模块pytz

  • 安装pytz模块,执行命令pip install pytz;重启项目;
  • 注意上图中的时间未对应上,因为mysite1/settings.py中时区默认设置的是UTC,需要修改为东八区:TIME_ZONE = “Asia/Shanghai”;在看下显示时间就正确了;

丰富Blog列表的展示

查看已经创建的文章列表:列项的显示还可以更丰富一些,只需编辑blog/admin.py

from django.contrib import admin# Register your models here.from .models import BlogArticles  # 引入BlogArticles类class BlogArticlesAdmin(admin.ModelAdmin):list_display = ("title", "author", "publish")list_filter = ("publish", "author")search_fields = ("title", "body")raw_id_fields = ("author",)date_hierarchy = "publish"ordering = ["publish", "author"]admin.site.register(BlogArticles, BlogArticlesAdmin)  # 在admin中注册该类

修改前:

修改保存后,刷新界面:

小酌Django2——博客文章发布相关推荐

  1. 小酌Django4——博客文章展示

    小酌Django4--博客文章展示 文章列表页 已发布的文章列表展示页面,展示文章标题: 交互模式下的数据读取 blog/models.py中创建数据模型后,Django会自动提供数据库抽象的API( ...

  2. 富文本编辑器应该这么用【博客文章发布、日常记录神器】

    剑阁峥嵘而崔嵬,一夫当关,万夫莫开 –‰

  3. 基于Hexo框架快速搭建个人博客--文章一键发布(五)

    基于Hexo框架快速搭建个人博客--文章一键发布 一.文章对比 二.发布到Github 三.一键发布 四.总结 博客链接: 会思想的苇草i 文章链接: 基于Hexo框架快速搭建个人博客–搭建(一) 基 ...

  4. 微信小程序版博客——开发汇总总结(附源码)

    花了点时间陆陆续续,拼拼凑凑将我的小程序版博客搭建完了,这里做个简单的分享和总结. 整体效果 对于博客来说功能页面不是很多,且有些限制于后端服务(基于ghost博客提供的服务),相关样式可以参考截图或 ...

  5. 如何使用live writer客户端来发布CSDN的博客文章?

    如何使用live writer客户端来发布CSDN的博客文章? http://blog.csdn.net/soune/article/details/4439158 live writer是写博客的一 ...

  6. python小爬虫(爬取职位信息和博客文章信息)

    1.python爬取招聘信息 简单爬取智联招聘职位信息(仅供学习) # !/usr/bin/env python # -*-coding:utf-8-*- """ @Au ...

  7. 新东方:俞敏洪个人博客文章不代表公司观点 半年报即将发布

    1月11日消息,新东方在港交所发布公告表示,公司董事会注意到,近期有多份有关本公司的媒体报道,包括引用俞敏洪自2022年1月8日起在"老俞闲话"发表的个人博客文章,内容有关(其中包 ...

  8. 利用Word2010在博客园发布文章入门

    使用Word发布博客优点多多,本文简单介绍 1.打开Word2010 新建 博客文章 双击即可创建 2.第一次创建会弹出注册博客账户对话框,点击立即注册,当然你也可以选择以后注册. 3.在新建博客账户 ...

  9. 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)...

    [爬虫]利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2) 第一篇( http://blog.itpub.net/26736162/viewspace-22865 ...

最新文章

  1. hive表指定分区字段搜索_Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件...
  2. Java动态代理生成的对象导出方法
  3. 设计模式之--原型模式
  4. 根本不存在 DIV + CSS 布局这回事
  5. 如何利用火狐获取网址中的提交链接
  6. WP Rocket插件无需授权版本
  7. 关于JavaScript中cookie的用法例子
  8. 第二章:Improving On User Commands--22.显示不同时区的时间
  9. 数字化风控全流程 实操课程V2.0 第三期
  10. 挨踢部落坐诊第六期:机器学习如何判断突发情况?
  11. 课程设计旅游景点咨询系统
  12. siamfc++自己学习笔记
  13. 飞书信外贸移动社交自建站系统玩转海外拼团分销
  14. [USACO] Team Tic Tac Toe
  15. 网易历届笔试面试题整理大全
  16. 实验五 类和对象-3 zxt
  17. html ajax实现ntlm,jquery – 在一个页面上通过AJAX POST获取NTLM挑战
  18. 秋季31种常见病的预防
  19. 改变世界的9大算法--搜索引擎索引
  20. 使用MindStudio完成ch_PP-OCRv2_det模型开发

热门文章

  1. Adobe DMP的一些设计
  2. 人类数据总量_人类已产生五十亿GB数据 X一代贡献的数据总量最大
  3. 全球与中国体积视频软件市场深度研究分析报告
  4. 网络营销人员21条基本能力要求
  5. MATLAB---约束最小平方滤波
  6. 单片机毕业设计 stm32火灾报警系统
  7. Oracle表空间及表分区
  8. 2010年度先进单位、先进个人、优秀辅导教师名录
  9. Python爬虫教你获取4K超清壁纸图片,手把手教你跟我一起爬!
  10. 史上最小白之Bert详解