欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django入门实战——实现个人博客

程序员文章站 2022-10-28 10:15:14
慕课网Django三小时入门,视频链接鸭~个人学习笔记,如有错误,欢迎指正。在python web开发领域有三个著名的框架:django、Flask、Tornado。Django课程内容简介第一章 课程准备工作第二章 Django项目初体验2.1 初识Django项目2.2 初识Django应用2.3 Django HelloWorld第三章 初识Django模型层模型层简介创建博客文章模型初识Django Shell初识Django Admin模块实现博客数据返回页面第四章 初识Django视图....

慕课网Django三小时入门,视频链接鸭~
个人学习笔记,如有错误,欢迎指正。

在python web开发领域有三个著名的框架:django、Flask、Tornado。

第一章 课程准备工作

  1. python环境的安装 3.5+
  2. Django环境的安装 2.0
    pip install django==2.0
  3. PyCharm IDE安装(都可,我用的Spyder)

第二章 Django项目初体验

2.1 初识Django项目

Django入门实战——实现个人博客

Django的基本命令

  1. startproject #创建一个Django项目
  2. startapp #创建一个Django应用
  3. check # 校验项目完整性
  4. runserver #本地简易运行Django项目
  5. shell #进入Django项目的Python Shell 环境
  6. test # 执行Django用例测试
  7. makemigrations #创建模型变更的迁移文件
  8. migrate #执行上一个命令创建的迁移文件
  9. dumpdata #把数据库数据导入到文件
  10. loaddata # 把文件数据导入到数据库

创建一个Django项目
Django入门实战——实现个人博客
Django入门实战——实现个人博客
项目目录介绍:

  • 项目配置文件:setting.py
  • 项目路由器配置文件:urls.py
  • 项目管理文件:manage.py

2.2 初识Django应用

关于Django应用和Django项目:
1.一个Django项目就是一个基于Django的Web应用
2. 一个Django应用就是一个可重用的Python软件包
3. 每个应用可以自己管理模型、视图、模板、路由和静态文件等
一个Django项目包含一组配置和若干个Django应用
Django入门实战——实现个人博客
创建一个Django应用

python manage.py startapp blog

Django入门实战——实现个人博客
Django应用目录介绍

  • views.py:视图处理的地方
  • model.py:定义应用模型的地方
  • admin.py:定义Admin模块管理对象的地方
  • apps.py:声明应用的地方
  • tests.py:编写应用测试用例的地方
  • urls.py:(自行创建)管理应用路由的地方

2.3 Django HelloWorld

Django视图

  • 没有框架的时代:hello.html
  • 不可能通过HTML表达网页所有的内容
  • Django视图产生内容

Django路由

  • runserver可以看到Django欢迎界面
  • 请求没办法到达刚才的视图函数
  • 需要配置路由绑定视图函数和URL

实现Hello World

#blog/views.py
from django.http import HttpResponse
def hello_world(request):
	return HttpResponse("hello world")


#新建blog/urls.py
from django.urls import path, include
import blog.views
urlpatterns = [
	path('hello_world',blog.views.hello_world)
]

#django_first/utils.py
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/',include('blog.urls')) #新加入的一行
]

#django_first/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'  #新加入的一行,BlogConfig在blog/apps.py
]

命令行输入:python manage.py runserver
浏览器输入网址:http://127.0.0.1:8000/blog/hello_world
Django入门实战——实现个人博客

第三章 初识Django模型层

3.1 模型层简介

模型层是什么?

  • 位于Django视图层和数据库之间
  • Python对象和数据库表之间转换
    Django入门实战——实现个人博客
    为什么需要模型层?
  • 屏蔽不同数据库之间的差异
  • 开发者更加专注于业务逻辑的开发
  • 提供很多便捷工具有助开发
    Django入门实战——实现个人博客
    模型层的相关配置
#模型层数据库相关配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

3.2 创建博客文章模型

设计博客模型

  • 文章标题 —— 文本类型
  • 文章摘要 —— 文本类型
  • 文章内容 —— 文本类型
  • 唯一ID标记 —— Int数字类型(自增、主键)
  • 发布日期 —— 日期类型

模型层定义字段

  • 数字类型:IntegerField
  • 文本类型:TextFiled
  • 日期类型:DateTimeField
  • 自增ID:AutoField
  • 主键定义:primary_key属性
#blog/migrations/models.py
from django.db import models

# Create your models here.
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入门实战——实现个人博客

3.3 初识Django Shell

Django Shell是什么?

  • Python Shell,用于交互式的Python编程
  • Django Shell也类似,继承Django项目环境

为什么需要Django Shell?

  • 临时性操作使用Django Shell更加方便
  • 小范围Debug更简单,不需要运行整个项目来测试

总之,Django Shell方便开发、方便调试,方便Debug。

Django Shell的使用
以“新建一篇文章”为例:
通过 python manage.py shell进入Django Shell的使用。
输入以下命令,新建并查看文章。
(下面有一个写错的地方,a.cotent❌a.content✔)
Django入门实战——实现个人博客

3.4 初识Django Admin模块

Django Admin模块是什么?

  • Django的后台管理工具
  • 读取定义的模型元数据,提供强大的管理使用页面
    为什么需要Django Admin模块?
  • Django Shell新增文章太复杂了
  • 管理页面是基础设施中重要的部分
  • 认证用户、显示管理模型、校验输入等功能类似

Django Admin模块的使用

  • 创建管理员用户
  • 登陆页面进行管理
    创建超级用户:python manage.py createsuperuser 填写用户名和密码。
    运行:python manage.py runserver
#blog/admin.py
from .models import Article
admin.site.register(Article)
#blog/models.py,用于显示文章标题
	def __str__(self):
		return self.title

浏览器中输入:http://127.0.0.1:8000/admin/即可进行各项操作,如新建文章,查看文章,查看用户等。
注意:在admin下新建文章时,可能会出现django.db.utils.OperationalError: no such table: main.auth_user__old问题,此时应该升级Django版本,可用pip3 install --upgrade django

Django入门实战——实现个人博客

3.5 实现博客数据返回页面

#blog/views.py
from blog.models import Article

def article_content(request):
	article = Article.objects.all()[0]
	title = article.title
	brief_content = article.brief_content
	content = article.content
	article_id = article.article_id
	publish_date = article.publish_date
	return_str = 'title: %s, brief_content: %s, content: %s, article_id: %s, publish_date: %s' %(title,brief_content,content,article_id,publish_date)
	return HttpResponse(return_str)
	
#blog/urls.py 应用级别的路由配置
urlpatterns = [
	path('hello_world',blog.views.hello_world),
	path('content',blog.views.article_content)
]

#django_first 项目级别的路由配置
urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/',include('blog.urls'))
]

命令行输入:python manage.py runserver开始运行。
浏览器输入:http://127.0.0.1:8000/blog/content
Django入门实战——实现个人博客

第四章 初识Django视图与模板

4.1 使用Bootstrap实现静态博客页面

页面布局设计:略
Bootstrap以及Bootstrap的栅格系统(12等份)
Django入门实战——实现个人博客
Django入门实战——实现个人博客
实现静态页面
新建blog/templates/index.html和blog/templates/detail.html

<!--detail.html-->
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>三小时入门Django Web框架</title>
	<!-- 最新版本的 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>
</head>
<body>
<div class="container page-header">
	<h1>文章标题1</h1>
</div>
<div class="container body-main">
	<div>
		<p>我有一个梦,像雨后彩虹,用所有泪水换来笑容。</p>
		<p>还有一种爱,穿越了人海,拾起那颗迷失的尘埃。</p>
	</div>
</div>
</body>
</html>

<!--index.html-->
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>三小时入门Django Web框架</title>
	<!-- 最新版本的 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>
</head>
<body>
<div class="container page-header">
	<h1>三小时入门Django Web框架
	<small>——霞霞子学习中</small>
	</h1>
</div>
<div class="container page-body">
	<div class="col-md-9" role="main">
		<div class="body-main">
			<div>
				<h2>文章标题1</h2>
				<p>我有一个梦,像雨后彩虹,用所有泪水换来笑容。</p>
				<p>还有一种爱,穿越了人海,拾起那颗迷失的尘埃。</p>
			</div>
			<div>
				<h2>文章标题2</h2>
				<p>你的呼吸,越靠越近,将我抱紧。呜~</p>
				<p>我睁开双眼,想你在身边,无所谓永远还是瞬间。</p>
			</div>
		</div>
	</div>
	<div class="col-md-3" role="complementary">
		<h2>最新文章</h2>
		<h4><a href="#">最新文章1</a></h4>
		<h4><a href="#">最新文章2</a></h4>
		<h4><a href="#">最新文章3</a></h4>
		<h4><a href="#">最新文章4</a></h4>
		<h4><a href="#">最新文章5</a></h4>
		<h4><a href="#">最新文章6</a></h4>
		<h4><a href="#">最新文章7</a></h4>
		<h4><a href="#">最新文章8</a></h4>
		<h4><a href="#">最新文章9</a></h4>
		<h4><a href="#">最新文章10</a></h4>
	</div>
</div>
</body>
</html>

4.2 初识Django的模板系统

模板系统简介

  • 视图文件不适合编码HTML
  • 页面设计改变需要修改Python代码
  • 网页逻辑和网页视图应该分开设计
  • 模板系统的表现形式是文本
  • 分离文档的表现形式和表现内容
  • 模板系统定义了特有的标签占位符

基本语法
变量标签:{{变量}} 例如:<html><body>{{now}}</body></html>
for循环标签:{% for x in list %}, {% endfor %}
例如:

<ul>
	{% for item in list %}
		<li>{{ item }} </li>
	{% endfor %}
</ul>

if-else分支标签:{% if %}, {% else %}, {% endif %}
例如:

{% if true %}
	<p> it is a true part.</p>
{% else %}
	<p> it is a false part.</p>
{% endif %}

4.3 使用模板系统渲染博客页面

博客首页

<!--index.html-->
<div class="container page-body">
	<div class="col-md-9" role="main">
		<div class="body-main">
			{% for article in article_list %}
			<div>
				<h2>{{article.title}}</h2>
				<p>
					{{article.brief_content}}
				</p>
			</div>
			{% endfor %}
		</div>
	</div>
	<div class="col-md-3" role="complementary">
		<h2>最新文章</h2>
		{% for article in article_list %}
		<h4><a href="#">{{article.title}}</a></h4>
		{% endfor %}
	</div>
</div>
#veiws.py
def get_index_page(request):
	all_article = Article.objects.all()
	return render(request,'index.html',
		{
			'article_list':all_article
		})

#urls.py
urlpatterns = [
	path('hello_world',blog.views.hello_world),
	path('content',blog.views.article_content),
	path('index',blog.views.get_index_page)
]
命令行:python manage.py runserver
地址:http://127.0.0.1:8000/blog/index

文章详情页

<!--detail.html-->
<div class="container page-header">
	<h1>{{curr_article}}</h1>
</div>
<div class="container body-main">
	<div>
		{% for section in section_list %}
		<p>{{ section }}</p>
		}
		{% endfor %}
	</div>
</div>
#views.py
def get_detail_page(request):
	curr_article = Article.objects.all()[0]
	#换行显示内容。
	section_list = curr_article.content.split('\n')
	return render(request,'detail.html',
		{
			'curr_article':curr_article,
			'section_list':section_list
		})
#urls.py
urlpatterns = [
	path('hello_world',blog.views.hello_world),
	path('content',blog.views.article_content),
	path('index',blog.views.get_index_page),
	path('detail',blog.views.get_detail_page)
]

命令行:python manage.py runserver
地址:http://127.0.0.1:8000/blog/index

将外部文章导入Django数据库里。

文章源码可直接在视频部分-资料下载处下载。
在运行时若出现,ModuleNotFoundError: No module named ‘django_first’ 时莫慌!!!仔细修改即可!!!
我将在下面写出我的解决方案,如有其他更好的方法,欢迎分享。

将下载的tools/import_data.py和data文件夹一同复制,放在django_first文件夹下(或你创建的项目的文件)。

修改import_data.py即可。
Line 8:os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_first.settings")

Line 14:data_path = './data/article'

命令行中运行 import_data.py文件: python import_data.py
运行项目即可查看。

成果图嘿嘿~
Django入门实战——实现个人博客

4.4 实现文章详情页面的跳转

Django入门实战——实现个人博客
以article_id指定相应的文章。
具体代码如下所示:

#blog/urls.py
urlpatterns = [
	path('hello_world',blog.views.hello_world),
	path('content',blog.views.article_content),
	path('index',blog.views.get_index_page),
	#path('detail',blog.views.get_detail_page)
	path(r'detail/<int:article_id>',blog.views.get_detail_page)
]

#views.py
def get_detail_page(request,article_id):
	all_article = Article.objects.all()
	curr_article = None
	for article  in all_article:
		#注意!这里是int(article_id)哦~
		if article.article_id == int(article_id):
			curr_article = article
			break

	#换行显示内容。
	section_list = curr_article.content.split('\n')
	return render(request,'detail.html',
		{
			'curr_article':curr_article,
			'section_list':section_list
		})
<!--index.html-->
<a href="/blog/detail/{{article.article_id}}">{{article.title}}</a>

命令行:python manage.py runserver
浏览器:http://127.0.0.1:8000/blog/index,点击文章标题即可跳转。

4.5 实现上下篇文章跳转

Django入门实战——实现个人博客

<!--blog/detail.html 按钮-->
<nav aria-label="...">
		<ul class="pager">
			<li><a href="/blog/detail/{{previous_article.article_id}}">上一篇:{{previous_article.title}}</a></li>
			<li><a href="/blog/detail/{{next_article.article_id}}">下一篇:{{next_article.title}}</a></li>
		</ul>
</nav>
#blog/views.py
def get_detail_page(request,article_id):
	all_article = Article.objects.all()
	curr_article = None
	previous_index = 0
	next_index = 0
	previous_article = None
	next_article = None

	for index, article  in enumerate(all_article):
		if index == 0:
			previous_index = 0
			next_index = index + 1
		elif index == len(all_article) - 1:
			previous_index = index - 1
			next_index = index
		else:
			previous_index = index - 1
			next_index = index + 1

		if article.article_id == int(article_id):
			curr_article = article
			previous_article = all_article[previous_index]
			next_article = all_article[next_index]
			break

	#换行显示内容。
	section_list = curr_article.content.split('\n')
	return render(request,'detail.html',
		{
			'curr_article':curr_article,
			'section_list':section_list,
			'previous_article':previous_article,
			'next_article':next_article
		})

命令行:python manage.py runserver
浏览器:http://127.0.0.1:8000/blog/detail/1

4.6 实现分页功能

Django入门实战——实现个人博客
Django入门实战——实现个人博客
设计分页的URL:/blog/index?page=1 (分页为1的首页)
Django分页组件的使用方法:

In [1]: from django.core.paginator import Paginator

In [2]: l = [1,2,3,4]

In [3]: l
Out[3]: [1, 2, 3, 4]

In [5]: p = Paginator(l,2)

In [6]: p.num_pages
Out[6]: 2

In [7]: p.count
Out[7]: 4

In [8]: page1= p.page(1)

In [9]: page1.object_list
Out[9]: [1, 2]

In [10]: page2 = p.page(2)

In [11]: page2.object_list
Out[11]: [3, 4]

In [12]: page1.has_next()
Out[12]: True

In [14]: page1.has_previous()
Out[14]: False

In [15]: page2.has_previous()
Out[15]: True
<!--index.html-->
<div class="body-footer">
		<div class="col-md-4 col-md-offset-3">
			<nav aria-label="Page navigation">
				<ul class="pagination">
				    <li>
				       <a href="/blog/index?page={{previous_page}}" aria-label="Previous">
				       <span aria-hidden="true">&laquo;</span>
				       </a>
				    </li>
				    {% for num in page_num %}
				    <li><a href="/blog/index?page={{num}}">{{num}}</a></li>
				    {% endfor %}
				    <li>
				    <a href="/blog/index?page={{next_page}}" aria-label="Next">
				       <span aria-hidden="true">&raquo;</span>
				    </a>
				    </li>
				</ul>
			</nav>
	</div>
</div>
#views.py
from django.core.paginator import Paginator
def get_index_page(request):
	page = request.GET.get('page')
	if page:
		page = int(page)
	else:
		page = 1
	print('page param:',page)
	all_article = Article.objects.all()

	pagintor = Paginator(all_article,3)
	page_num = pagintor.num_pages
	print('page num:', page_num)
	page_article_list = pagintor.page(page)

	if page_article_list.has_next():
		next_page = page + 1
	else:
		next_page = page 
	if page_article_list.has_previous():
		previous_page = page - 1
	else:
		previous_page = page	

	return render(request,'index.html',
		{
			'article_list':page_article_list,
			'page_num':range(1,page_num+1),
			'curr_page':page,
			'next_page':next_page,
			'previous_page':previous_page
		})

4.7 实现最近文章列表

<!--index.html-->
<div class="col-md-3" role="complementary">
	<h2>最新文章</h2>
	{% for article in top5_article_list %}
	<h4><a href="/blog/detail/{{article.article_id}}">{{article.title}}</a></h4>
	{% endfor %}
</div>
def get_index_page(request):
	page = request.GET.get('page')
	if page:
		page = int(page)
	else:
		page = 1
	print('page param:',page)
	all_article = Article.objects.all()

	top5_article_list = Article.objects.order_by('-publish_date')[:5]

	pagintor = Paginator(all_article,3)
	page_num = pagintor.num_pages
	print('page num:', page_num)
	page_article_list = pagintor.page(page)

	if page_article_list.has_next():
		next_page = page + 1
	else:
		next_page = page 
	if page_article_list.has_previous():
		previous_page = page - 1
	else:
		previous_page = page	

	return render(request,'index.html',
		{
			'article_list':page_article_list,
			'page_num':range(1,page_num+1),
			'curr_page':page,
			'next_page':next_page,
			'previous_page':previous_page,
			'top5_article_list':top5_article_list
		})

第五章 课程总结

项目源码在视频下方都可下载呀!
历时三天,学完啦~
如果错误还请指正!
还有很多知识没有涉及到!以后继续补充呀~
继续加油鸭!!!

本文地址:https://blog.csdn.net/weixin_43627723/article/details/107518747

相关标签: Django python web