Advertisement

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 菜单下有一个:

AAffA0nNPuCLAAAAAElFTkSuQmCC

运行manage文件

点击之后出现:

AAffA0nNPuCLAAAAAElFTkSuQmCC

image.png

如果结果与我的不同,可能是因为mysql驱动未正确安装,建议尝试重新安装mysql驱动程序;遇到问题时,可以参考相关技术文档获取进一步指导

接下来跟上文一样,执行 makemigrations 和 migrate 。

完成之后,到navicat 查看生成的数据表。:

AAffA0nNPuCLAAAAAElFTkSuQmCC

生成的数据表

这一步跟上文的大体上一致,并非更换数据库后会有什么不同;依然可以采用 sqlite3 这一工具进行操作;流程相同。

注意到我们自己写的数据表也在上方

我们在我们编辑的数据表里添加一些字段。

AAffA0nNPuCLAAAAAElFTkSuQmCC

数据表

我们插入了一条记录。

页面呈现数据

数据我们有了,我们要把数据展现在页面上

后台步骤在 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 }}

最后我们启动一下服务

AAffA0nNPuCLAAAAAElFTkSuQmCC

正确运行

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入口

开启服务,访问一下:

AAffA0nNPuCLAAAAAElFTkSuQmCC

登录管理系统

登录看一下:

AAffA0nNPuCLAAAAAElFTkSuQmCC

管理系统

看到是英文,好吧,我们改一下显示成中文

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)

切换浏览器,刷新一下页面:

AAffA0nNPuCLAAAAAElFTkSuQmCC

数据正确显示

我们可以点进去修改数据等操作。

修改数据库默认名称在 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

改完之后,重新刷新页面:

AAffA0nNPuCLAAAAAElFTkSuQmCC

更改后

完善博客

基于之前的学习内容掌握了一定的知识基础。接下来就让我们开始完善我们的博客系统

博客页面设计

主要由三个页面组成博客主页面

博客文章内容页面

博客写作撰写页面

主页面内容

这里是我们博客的入口页面主要有以下两个内容文章标题列表,超链接

发表博客的按钮(超链接)

编写思路从数据库中取出所有的文章对象

将文章打包成列表,传递到前端

前端页面把文章以标题超链接的形式逐个列出

模板 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 %}

重启下服务器:

AAffA0nNPuCLAAAAAElFTkSuQmCC

页面

博客文章页面

页面内容标题

文章内容

修改文章的按钮(超链接)

代码: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),

]

这里注意正则表达式的写法。

启动服务:

AAffA0nNPuCLAAAAAElFTkSuQmCC

文章页面

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)

启动服务就可以看到页面啦

AAffA0nNPuCLAAAAAElFTkSuQmCC

编辑页面

接下来完成表单提交的响应函数

这里是接收数据提交给后台,所以要用到 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 了。

这里就当个教训好了,希望大家别犯这样低级的错误。手动捂脸。

好了,继续。

我们在编辑新文章页面添加了数据跳转到主页面:

AAffA0nNPuCLAAAAAElFTkSuQmCC

我们把新文章的链接也补充一下:

在主页的 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增强

AAffA0nNPuCLAAAAAElFTkSuQmCC

后台管理系统

我们想把内容也显示出来怎么做呢?

让我们仔细查看一下我们的 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

链接:https://www.jianshu.com/p/4d5c3c361bc4

全部评论 (0)

还没有任何评论哟~