Django+Python+Bootstrap 实现简单的博客页面
-
模型层
- 模型层是什么?
- 位于Django视图层和数据库之间的组件,Python对象和数据库表之间的转换
- 为什么需要模型层?
- 屏蔽不同数据库之间的差异,开发者更加专注于业务逻辑的开发,提供很多便捷工具有助于开发
- 模型层的配置?
- 在
settings.py
文件上,重点关注DATABASE
的配置:‘ENGINE’
意思是指数据库用的是哪一个数据库的驱动;‘name’
是指数库的名字+文件名,是数据库对应文件夹和文件名。
- 在
- 模型层是什么?
-
创建模型
- 模型层定义字段
- 数据类型:IntegerField
- 文本类型:TextField
- 日期类型:DateTimeField
- 自增:AutoField
- 主键:primary_key
- 外键:ForeignKey
- 设计数据库字段,在应用层
models.py文件
中设置表,字段,主键
from django.db import models class Article(models.Model): # 文章的唯一ID article_id = models.AutoField(primary_key=True) # 文章的标题 title = models.TextField() # 文章的摘要 brief_content = models.TextField() # 文章的主要内容 content = models.TextField() # 文章的发布时间 publish_date = models.DateTimeField(auto_now=True)
- 创建迁移字段,运行命令
python manage.py makemigrations
- 迁移字段
python manage.py migrate
- 模型层定义字段
-
Django Admin
- 创建管理员账户
python manage.py createsuperuser
- 运行项目,输入
http://127.0.0.1:8000/amdin
,进入后台,使用账户登陆。 - 打开应用
admin.py
文件,添加admin.site.register(Article)
进行注册。 - 后台查看/编辑自己创建的博客内容。
- 显示文章标题,打开
models.py
,添加如下代码from django.db import models class Article(models.Model): # 文章的唯一ID article_id = models.AutoField(primary_key=True) # 文章的标题 title = models.TextField() # 文章的摘要 brief_content = models.TextField() # 文章的主要内容 content = models.TextField() # 文章的发布时间 publish_date = models.DateTimeField(auto_now=True) # 新增的显示标题代码 def __str__(self): return self.title
-
django模板系统基本语法
变量标签
{{variable_name}}
for循环标签
{%for x in list %},{% endfor %}
if-else标签{% if %},{%.else %},{% endif %}
-
Bootstrap 渲染博客页面
在项目templates
文件夹下新建blog
文件夹,在blog文件夹下创建index.html和detail.html文件。编写
index.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- 最新的 Bootstrap 核心 JavaScript 文件 --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> <title>学习Django框架</title> </head> <body> <div class="container page-header"> <h1>学习Django框架 <small> —— By DBJ开发</small> </h1> </div> <div class="container page-body"> <div class="col-md-9" role="main"> <div class="body-main"> {% for article in article_list %} <div> <h2> <a href="/blog/detail/{{ article.article_id }}">{{ article.title }}</a></h2> <p> {{ article.brief_content }} </p> </div> {% endfor %} </div> </div> <div class="col-md-3" role="complementary"> <div> <h2> 最新文章</h2> {% for article in article_list %} <h4><a href="/blog/detail/{{ article.article_id }}"> {{ article.title }}</a></h4> {% endfor %} </div> </div> </div> </body> </html>
编写
detail.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <html lang="en"> <head> <meta charset="UTF-8"> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- 最新的 Bootstrap 核心 JavaScript 文件 --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> <title>{{ current_article.title }}</title> </head> <body> <div class="container page-header"> <h1>{{ current_article.title }} </h1> </div> <div class="container body-main"> <div> <p> {% for section in section_list %} {{ section }} {% endfor %} </p> </div> </div> </body> </html></title> </head> <body> </body> </html>
编写视图
views.py
文件# index def get_index_page(request): all_article = Article.objects.all() return render(request, 'blog/index.html', { 'article_list': all_article } ) # detail def get_detail_page(request, article_id): all_article = Article.objects.all() current_article = None for article in all_article: if article.article_id == article_id: current_article = article break section_list = current_article.content.split("\n") return render(request, 'blog/detail.html', { 'current_article': current_article, 'section_list': section_list } )
注意
blog/index.html
路径名字和你前面建的文件名字对应,项目默认会去找templates
文件。打开应用
urls.py文件
添加路由path(‘index’, blog.views.get_index_page),
path(‘detail/int:article_id’, blog.views.get_detail_page)