django mysql 博客_Django搭建个人博客(二)
更换数据表mysql
上文提到我们完成了model模块的开发,并建立了生成数据表的功能;过去我们使用的是Django所默认的数据库 sqlite3 ,为了优化存储结构,在这里我们更换为采用mysql数据库进行存储。
我们在 navicat for mysql 中新建数据库 blogdjango 。
至于 navicat for mysql 的安装及配置请大家自行百度。
在 settings.py 文件中:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'blogdjango', 'USER':'root', 'PASSWORD':'', # 这里填写密码
'HOST':'127.0.0.1'
}
}
上文我们映射生成数据表是在 manage.py 的同级目录下:E:\myblog>
这里我们在换一种运行方式,目的是多了解一种运行方式。
在pycharm 上方的 Tools 菜单下有一个:

运行manage文件
点击之后出现:

image.png
如果结果与我的不同,可能是因为mysql驱动未正确安装,建议尝试重新安装mysql驱动程序;遇到问题时,可以参考相关技术文档获取进一步指导
接下来跟上文一样,执行 makemigrations 和 migrate 。
完成之后,到navicat 查看生成的数据表。:

生成的数据表
这一步跟上文的大体上一致,并非更换数据库后会有什么不同;依然可以采用 sqlite3 这一工具进行操作;流程相同。
注意到我们自己写的数据表也在上方
我们在我们编辑的数据表里添加一些字段。

数据表
我们插入了一条记录。
页面呈现数据
数据我们有了,我们要把数据展现在页面上
后台步骤在 views.py 中 import models
article = models.Article.objects.get(pk=1)
render(request, page, {'article': article}) from models import as def index(request):
通过查询models.Ariticle.objects获取id为1的文章对象,并将其渲染到request的博客列表页面中
后台步骤
模板可直接使用对象以及对象的 ‘ . ’ 操作
{{article.title}}就可以了
在模板 templates 下的index.html 文件中:html>
Title
{{ article.title }}
{{ article.content }}
最后我们启动一下服务

正确运行
admin 简介
Admin 是 Django 自带的一个功能强大的自动化数据管理界面。
自带的后台管理系统
被授权的用户可直接在 Admin 中管理数据库(增删改查)
Django 提供了许多针对 Admin 的定制功能
配置 Admin
Django已经实现了管理员账号的生成我们现在只需生成一个用户名即可
python manage.py createsuperuser 创建一个超级用户
请查看我的创建流程:D:\pycharm\PyCharm 2018.2\bin\runnerw.exe" C:\Users\19244\AppData\Local\Programs\Python\Python36-32/python.exe "D:\pycharm\PyCharm 2018.2\helpers(pycharmdjango_manage.py) 生成超级用户 E:/个人博客
Tracking file by folder pattern: migrations
Username (leave blank to use '19244'): admin
Enter your email account: admin@admin.com
Password (again): sixkery123Error: Your passwords didn't match.
Warning: Password input may be echoed.
Password: sixkery@123
Warning: Password input may be echoed.
Password (again): sixkery@123
Superuser created successfully.
Process finished with exit code 0
密码选好,为了保密 。
localhost:8000/admin Admin入口
开启服务,访问一下:

登录管理系统
登录看一下:

管理系统
看到是英文,好吧,我们改一下显示成中文
在 settings.py 文件中修改:LANGUAGE_CODE = 'zh_Hans'
就可以了。再次登录查看就会显示中文。
可以显示中文了,但是我们的数据呢?
这里想要操作数据,还要配置一下应用
在应用下 admin.py 中引入自身的 models 模块(或里面的模型类)
为了实现对models.Ariticle模型的管理功能,在django/extra/orm/admin.py文件中添加admin.site.register(models.Ariticle),并导入django.contrib.admin模块中的admin类以及blog模块中的Ariticle模型。
admin.site.register(Ariticle)
切换浏览器,刷新一下页面:

数据正确显示
我们可以点进去修改数据等操作。
修改数据库默认名称在 Article 类下添加一个方法
根据 python 版本选择
python 3:str(self)
python 2:_unicode(self)
return self.title
在 Django 的 models.py 文件中:import django.db.modelsclass Ariticle(django.db.models.Model):
有必选参数,最大长度
title = models.CharField(max_length=32, default='Title') # 不允许指定必填参数, 无需提供默认值
content = models.TextField(null=True) def str(self):
return self.title
改完之后,重新刷新页面:

更改后
完善博客
基于之前的学习内容掌握了一定的知识基础。接下来就让我们开始完善我们的博客系统
博客页面设计
主要由三个页面组成博客主页面
博客文章内容页面
博客写作撰写页面
主页面内容
这里是我们博客的入口页面主要有以下两个内容文章标题列表,超链接
发表博客的按钮(超链接)
编写思路从数据库中取出所有的文章对象
将文章打包成列表,传递到前端
前端页面把文章以标题超链接的形式逐个列出
模板 for 循环
{% for xx in xxs %}
HTML 语句
{% endfor %}
在 views.py 文件下:
从 django.shortcuts 导入 render;
从 django.http 导入 HttpResponse;
引入 models 模块;
定义一个 index 函数,
该函数接收 request 参数;
获取所有的文章对象
all articles = models.Ariticles.objects.all()
return to render(request, 'blog/index.html',{
'articles': articles
})
切换到前端:html>
Title
新文章{% for article in articles %}{{ article.title }}
{% endfor %}
重启下服务器:

页面
博客文章页面
页面内容标题
文章内容
修改文章的按钮(超链接)
代码:def index(request): # 获取所有的文章对象
queryset = models.Ariticle.objects.all()
context = {'articles': articles}
return render(request, 'blog/index.html', context)
def view_article(request, article_id):
# 文章详情页面
pass
根据pk从数据库中获取文章对象,并将它传递给前端页面渲染。
在 templates 文件夹下的 blog 文件中创建一个新的 article_page.html 文件:html>
Article Page
{{ article.title }}
{{ article.content }}
修改文章
配置 urlfrom django.urls import pathfrom . import views
urlpatterns = [
path('index/', views.index),
path('article//', views.article_page),
]
这里注意正则表达式的写法。
启动服务:

文章页面
Django 中的超链接
超链接的目标地址:在 HTML 语言中,href 后面的是目标地址
在 Django
template 中可以用 {%url 'app_name:url_name' param%}
其中 app_name 和 url_name 都在 url 中配置
在配 URL
在include()函数中作为第二个参数的位置上使用root urls作为名称中的URLs,并设置namespace属性为'blog'
应用下则写在 url() 的第三个参数位置, name='article'
这两种写法主要基于是否采用了include()引用了另一个url配置文件
根 urls.pyurlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls',namespace='blog')),
path('blog2/', include('blog2.urls')),
]
应用下 urls.py:from django.urls import pathfrom . import views
app_name = 'blog' # 这句一定要加urlpatterns = [
path('index/', views.index),
path('article//', views.article_page,name='article'),
]
配置之后打开页面发现链接可以使用了
博客撰写页面开发
页面内容标题编辑栏
文章内容编辑区域
提交按钮
首先创建一个 HTML 文件,。命名为 edit_pagehtml>
Edit Page
文章标题
文章内容
前端页面已成功完成。接下来分析一下后端该如何实现。尽管只有一个编辑界面存在,但实际上涉及到了两个不同的响应函数:其中之一是该页面自身的响应功能;另一个则是表单提交的目的地。
在views.py 文件中写响应函数。def edit_page(request):
return render(request,'blog/edit_page.html')
添加 url :urlpatterns = [
path('index/', views.index),
path('article//', views.article_page,name='article_page'),
path('edit/', views.edit_page)
启动服务就可以看到页面啦

编辑页面
接下来完成表单提交的响应函数
这里是接收数据提交给后台,所以要用到 post 方法
使用request.POST['参数名'] 获取表单数据
生成实例 models<Article.objects.create(title, content)> 定义 edit_action 函数
title = request.POST.get('title','TITLE') # 获取request里的数据
content = request.POST.get('content','CONTENT') # 获取request里的数据
使用 models 模块中的 article 对象实例化一个新的文章实例,并将 title 和 content 参数赋值给该实例;用于生成文章内容
获取所有文章 articles = models<Article objects.all()
调用 render 函数渲染模板 return render(request, 'blog/index.html', {'articles': articles})
跳转到主页面地址 # 返回主页面
添加 urlurlpatterns = [
path('index/', views.index),
path('article//', views.article_page,name='article_page'),
path('edit/', views.edit_page,name='edit_page'),
path('edit/action/', views.edit_action,name='edit_action')
]
再把前端的url添加进去
运行服务会抛出错误的根本原因是因为 Django 的安全机制设计不允许未经授权的数据提交行为
{% csrf_token %} 文章标题
我以为一直到那时都还觉得可以。
结果运行后未出现错误信息。
但页面跳转功能仍未正常执行。
老司机遇到这种情况肯定很清楚。
其实确实有问题。
到底出在哪儿呢?
这次的教训格外深刻啊!整整花了半天时间却仍未解决这个问题呀!实在无法自行解决后才上网寻求帮助啊!多方查阅资料后仍无头绪呢!实在感到沮丧至极啊!决定暂时离开片刻再重新审视问题吧!
实在没法不提的是PyCharm这个编辑器确实非常好用!当编写代码时出现错误时会提供非常便捷的提示功能!确实如此!主要是在单词拼写上出了问题!我在上方贴的代码中有两处出现了这样的问题!第一个是在models模块中的一个定义类:Article不得不承认这个拼写错误存在!这样一来就会导致整个数据库都需要重新迁移配置!
还有一个,编辑页面的 HTML 里 form 这个单词写成 from 了。
这里就当个教训好了,希望大家别犯这样低级的错误。手动捂脸。
好了,继续。
我们在编辑新文章页面添加了数据跳转到主页面:

我们把新文章的链接也补充一下:
在主页的 index.HTML 文件中:新文章
这样就OK啦
修改文章
为突出此功能需单独进行说明,并且必须存在内容才能算是进行修改操作;与新页面相比空置状态明显无法直接跳转至新页面,请采取相应措施完成内容迁移。
先来比较一下两个编辑页面
新文章为空,修改文章有内容
修改文章页面有文章对象
那么为什么会有这个对象呢?就是文章的 ID 唯一标识符。
我们优化了编辑页面的响应逻辑,并新增了一个函数模块iddef edit_page(request,article_id): if str(article_id) == '0': return render(request,'blog/edit_page.html’)
article instance is fetched from the database using the provided article ID.
the function renders a page to display the selected article details.
define an action to handle requests related to editing articles.
title = request.POST.get('title','TITLE') # 获取request里的数据
content = request.POST.get('content','CONTENT') # 获取request里的数据
article_id = request.POST.get('article','0') if article_id == '0': # 就编辑文章
生成文章对象实例,并将title参数赋值为指定的标题名称,并将content参数赋值为提供的内容描述。
获取所有文章对象
生成响应并传递到模板中
blog/index.html ,包含参数 articles: 所有文章对象
生成响应并传递到博客模板中
这里就是修改文章
article = models.Article.objects.get(pk=article_id)
article.title = title
article.content = content
调用save()函数,并将其返回值传递给render()函数(请求参数包含当前文章对象),跳转至文章页面
主页的 HTML 中修改:html>
Title
新文章{% for article in articles %}{{ article.title }}
{% endfor %}
文章页面中的修改文章按钮出修改(HTML):html>
Article Page
{{ article.title }}
{{ article.content }}
修改文章
最后一步是在编辑页面上进行操作:首先检查是否拥有文章ID;如果存在,则进行更新操作;否则,则直接从空白处创建新文章
Edit Page
{% csrf_token %}
{% if article %}
文章标题
文章内容
{% else %}
文章标题
文章内容
{% endif %}
在创建页面的过程中,需要将id配置为唯一的标识符以确保能够顺利地进行后续操作,并编写相应的逻辑代码来实现功能。
这样就完成了博客开发。完成博客开发是一个令人满意的结果。尽管表面看起来没有太多创新性,在整个过程中我们还是深入理解了许多技术细节,并通过实际操作熟悉了 Django 简单网页开发的过程。
一些小技巧
templates 过滤器
过滤器就是写在模板中的,属于 Django 模板语言
它的作用是可以修改模板中的变量,从而显示不同的内容。
写法
{{ value | filter }} 例:{{ list_nums | length }}
我们之前写的编辑页面的代码好多重复的,使用一下过滤器:html>
Edit Page
{% csrf_token %}
文章标题
文章内容
把if-else 语句也省了,是不是很好玩呀。
admin增强

后台管理系统
我们想把内容也显示出来怎么做呢?
让我们仔细查看一下我们的 admin.py 文件内容:它包含了 Django 的 contrib 模块以及 Blog 模块中的 models 导入了 Article 类。
admin.site.register(Article)
我们发现Article类被直接配置为后台管理系统,在此建议对以下代码进行调整:class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','content')
admin.site.register(Article,ArticleAdmin)
作者:sixkery
