18910140161

Django blog项目知识点总结

顺晟科技

2021-06-16 10:43:47

205

数据库操作部分

当我们在Django项目中的models.py下写好创建表的代码后。为了创建好这些数据库表,我们再一次请出我的工程管理助手管理。皮。激活虚拟环境,切换到manage.py文件所在的目录下,分别运行python manage.py makemigrations和python manage.py迁移命令:

复制代码

f : \ my blogpython管理器。py进行迁移

"博客"的迁移:

博客\迁移\ 0001 _ initial。巴拉圭

-创建模型类别

-创建模型帖子

-创建模型标签

-添加要发布的字段标签

F:\myblogpython manage.py迁移

要执行的操作:

应用所有迁移:管理、授权、博客、内容类型、会话

正在运行迁移:

应用contenttypes.0001 _ initial.好

应用auth.0001_initial.好

应用admin.0001 _初始.好

正在应用管理员。0002 _日志条目_删除_自动_添加.好

正在应用内容类型。0002 _ remove _ content _ type _ name.好

正在应用auth。0002 _ alter _ permission _ name _ max _ length.好

正在应用auth。0003 _ alter _ user _ email _ max _ length.好

应用auth。0004 _ alter _ user _ username _ opts.好

应用auth。0005 _ alter _ user _ last _ log in _ null.好

应用auth。0006 _ require _ content types _ 0002.好

应用auth。0007 _ alter _ validators _ add _ error _ messages.好

应用auth。0008 _ alter _ user _ username _ max _ length.好

应用blog.0001_initial.好

应用会话。0001 _初始.好

复制代码

然后我们可以具体查看终端里Django究竟是做了什么为我们创建数据表的?实际是通过对象关系映射(对象关系映射)将计算机编程语言命令翻译为结构化查询语言语言,操作数据库。

复制代码

f : \ myblogpython manage。py sqlmigreet博客0001

开始

-

-创建模型类别

-

CREATE TABLE ` blog _ category `(` id ` integer AUTO _ INCREMENT NOT NULL PRIMARY KEY,` name ` varchar(100)NOT NULL);

-

-创建模型帖子

-

创建表` blog _ post `(` id ` integer AUTO _ INCREMENT NOT NULL PRIMARY KEY,` title` varchar(70) NOT NULL,` body` longtext NOT NULL,` created _ time ` datetime(6)NOT NULL,` modified _ time ` datetime(6)NOT NULL,'

节选` varchar(200)非空,` author_id` integer NOT NULL,` category _ id ` integer NOT NULL);

-

-创建模型标签

-

CREATE TABLE ` blog _ tag `(` id ` integer AUTO _ INCREMENT NOT NULL PRIMARY KEY,` name ` varchar(100)NOT NULL);

-

-添加要发布的字段标签

-

创建表` blog _ post _ tags `(` id ` integer AUTO _ INCREMENT NOT NULL PRIMARY KEY,` post_id` integer NOT NULL,` tag _ id ` integer NOT NULL);

ALTER TABLE ` blog _ post ` ADD CONSTRAINT ` blog _ post _ author _ id _ DD 7a 8485 _ fk _ auth _ user _ id ` FOREIGN KEY(` author _ id `)REFERENCES ` auth _ user `(` id `);

ALTER TABLE ` blog _ post ` ADD CONSTRAINT ` blog _ post _ category _ id _ c 326 db F8 _ fk _ blog _ category _ id ` FOREDIAN KEY(` category _ id `)REFERENCES ` blog _ category `(` id `);

ALTER TABLE ` blog _ post _ tags ` ADD CONSTRAINT ` blog _ post _ tags _ post _ id _ a1c 71 c8a _ fk _ blog _ post _ id ` FORE

ALTER TABLE ` blog _ post _ tags ` ADD CONSTRAINT ` blog _ post _ tags _ tag _ id _ 0875 c 551 _ fk _ blog _ tag _ id ` FOREIG

ALTER TABLE ` blog _ post _ tags ` ADD CONSTRAINT ` blog _ post _ tags _ post _ id _ tag _ id _ 4925 EC 37 _ uniq ` UNIQUE(

犯罪

复制代码

查看这些结构化查询语言命令可以帮助我们理解Django的对象关系映射(对象关系映射)运行机制。

在manage.py所在目录下运行python manage.py shell命令:

(blog project _ env)c : \ Users \ yangg \ WorkSpace \ blog project python manage。py外壳

python 3。5 .2(v 3。5 .2:4 def 2 a 2901 a 5,2016年6月25日,22:18:55) [MSC v.1900 64位(AMD64)]在win32上

有关更多信息,请键入"帮助"、"版权"、"信用"或"许可证"。

(交互控制台)

这就打开了交互命令行。我们可以在其中具体添加数据表的信息。

从博客。模型导入类别,标签,文章

c=类别(名称='类别测试)

c.save()

t=标签(名称='标签测试)

t.save()

比如在这里实例化了一个种类类和一个标签类,为他们的属性名字赋了值。为了让Django把这些数据保存进数据库,调用实例的救援方法即可。

博客首页

Django处理超文本传送协议请求

后台与前端交互,请求响应流程是怎么实现的?

基本流程是用户请求,浏览器发送HTTP请求,服务器接收后返回响应(流程包括三次握手和四波),浏览器读取并显示数据。

在姜戈,你如何处理请求?内部流程是通过绑定URL和视图函数,编写视图函数处理请求,配置项目URL映射,分配路由,最后将数据返回给前端渲染模板显示来实现的。在views.py文件函数中,需要调用__str__方法来显示引用模型中字段的内容。

从django . utils . six import python _ 2 _ unicode _ compatible调用,然后可视化它,并将decorator @ python _ 2 _ unicode _ compatible添加到自定义函数中。

前端如何引入静态文件配置JS风格?

有必要在index.html主页中正确配置路径并引入js风格。在html文件顶部声明静态文件部署:{% load staticfiles %}

使用Django自己的模板语言在前端渲染数据,关键是区分模板变量和模板标签。模板变量的语法为{{ xxx }},中间嵌套要渲染的变量内容,可以包含变量和条件判断语句。模板标记语法为{% xxxss %},内容呈现在中间。

这个博客项目直接在网上复用一个网页模板,使用的时候可以微调布局。这是最考验前端技能的部分。如何调整风格才美观不凌乱?如何在不丢失元素的情况下显示最少的信息?实现良好的用户交互体验。

基于类的通用视图:列表视图和详细视图

在web开发中,虽然有些视图函数处理不同的对象,但是它们的基本逻辑是一致的。比如一个博客,一个论坛,虽然表达方式不同,但本质上都是一系列有序的文章/帖子列表。就首页查看功能而言,处理逻辑是从数据库中获取最新的文章列表,然后按时间顺序发送到前端,前端渲染显示。

Django将实现这一系列逻辑的代码细化为一系列通用视图函数,即基于类的视图。这个工具箱不同于基于函数的一般视图。

那么如何使用class view减少开发时间,提高开发效率呢?

这里我们将参考Django内置基类视图API中的通用显示视图函数,它包括ListView和DetailView两个子函数。正式文件将这两项职能概述如下:

以下两个基于类的通用视图旨在显示数据。在许多项目中,它们通常是最常用的视图。

#两个通用基类视图函数用于显示数据。它们在许多项目中的应用越来越广泛。

列表视图

例如,在一个博客项目中,几个不同的视图函数使用数据库中文章的列表数据,但所选数据略有不同。在这种情况下,可以使用ListView函数。

写一个类视图,首先要继承Django提供的一个类视图,需要继承哪一个取决于视图函数。

比如我们可以写一个IndexView类函数,它的函数是从数据库中获取Post列表,ListView是从数据库中获取某个模型的列表数据。

当然,我们把基于函数的视图改成了类视图,然后把url中的路由映射也改成了,但是这里把类视图改成了函数视图,不是有点绕弯吗?

但是,只要记住这个函数的实现方法,直接调用Django提供的as_view()方法就可以了。

复制代码

app_name='blog '

urlpatterns=[

url(r'^$',views.index,name='index '),

.

]

换成

app_name='blog '

urlpatterns=[

url(r'^$',观点。IndexView.as_view(),name='index '),

.]

复制代码

对于文章列表中某个分类下的文章,我们需要从URL中抓取文章ID,从数据库中获取分类,然后使用过滤过滤器获取该分类下的所有文章。

例如,在这种情况下,代码可以修改如下:

复制代码

blog/view . py

类别视图(列表视图):

模型=Post

template_name='blog/index.html '

context_object_name='post_list '

def get_queryset(self):

cate=get _ object _ or _ 404(Category,pk=self.kwargs.get('pk '))

返回超级(CategoryView,self)。get_queryset()。过滤器(类别=cate)

复制代码

在父类中,get_queryset()方法默认获取所有的文章列表,但是我们只需要分类的一部分,所以我们覆盖get_queryset()方法。

这里,首先根据从URL捕获的数据对数据进行分类。在类视图中,从URL捕获的命名组参数值保存在实例的kwargs属性(字典)中,未命名的组参数值保存在实例的args属性(列表)中。因此,这里使用self.kwargs.get('pk ')来获取从URL捕获的分类id值。然后我们调用父类的get_queryset方法得到所有文章的列表,然后调用filter方法过滤分类下的所有文章并返回。

详细视图

我们经常有这种需求。为了从数据库中获取一条数据,比如文章细节,我们需要获取相应的数据,并将其返回给前端模板进行渲染。对于这个需求,Django提供了DetailView类视图函数来解决。

这种视图函数的继承链是

class django . views . generic . detail . Detail view

当此视图执行时,self.object将包含视图正在操作的对象。#视图执行时,self。对象包含视图中的所有视图

对象,该对象对。可以理解为被获取的对象容器

祖先(MRO)

此视图函数继承的属性和方法来自这些视图函数:

复制代码

此视图从以下视图继承方法和属性:

django . views . generic . detail . SingleObjectTemplateresponsexin

django . view . generic . base . Templateresponsemixin

django . views . generic . detail . base detailview

django . view . generic . detail . SingleObjectMixin

django . view . generic . base . view

复制代码

在官方示例中:

复制代码

来自django . views . generic . detail import Detail view

从django.utils导入时区

来自文章。模型导入文章

class article Detail view(Detail view):

模型=文章

def get_context_data(self,**kwargs):

context=super()。get_context_data(**kwargs)

上下文['now']=timezone.now()

返回上下文

复制代码

这里,还是和ListView一致的。从URL捕获的命名组参数值存储在实例的kwargs属性(字典)中,未命名组参数值存储在实例的args属性(列表)中。因此,这里使用get_conext_data(**kwargs)来获取从URL捕获的上下文数据。

分页功能

分页是由Django内置的Paginator类提供的。这个类位于django/core/paginator.py,需要使用的时候只需要在合适的地方导入这个类即可。

只需实例化一个Paginator对象,在实例化的时候传入一个需要分页的list对象,就可以得到分页的对象数据。请注意,分页对象是列表类型数据。

分页器用于对文章列表进行分页。

在基于类的视图ListView中,已经包含了分类逻辑,所以我们只需要指定paginate_by属性就可以打开分页功能。

列表视图类视图包含几个关于分页的方法,记住:

分页器,分页器的一个实例。

Page_obj,当前请求页面的分页对象。

Is _ paged,是否已分页。分页页面只有在超过两页时才算分页。

Object_list,请求页面的对象列表,相当于post_list。因此,在模板中循环文章列表时,可以选择post_list或object_list。

分页功能扩展

我想在页面中显示这种效果

首先分析导航栏的组成,可以看到整个分页导航栏可以分为七个部分:

第1页的页码,需要一直显示。

第1页页码后的省略号。但是,应该注意的是,如果第1页上的页码后跟第2页,则不应显示省略号。

当前页码的左边部分,如这里的3-6。

当前页码,如这里的7。

当前页码的右边部分,如这里的8-11。

最后一个页码前的省略号。但是需要注意的是,如果最后一页的页码是连续的,就不应该显示省略号。

最后一页的页码。

回顾显示分页的步骤,经典的姜戈三部曲。首先定义视图函数,然后编写模板文件,最后将视图函数绑定到URL模式。

RSS订阅实现

博客中的Rss

RSS(true Simple Syndication)是一种描述和同步网站内容的格式,采用XML作为内容传递的格式。简单来说,网站可以将内容打包成符合RSS标准的XML格式文档。一旦网站内容符合统一标准,人们就可以开发一个工具来阅读这个标准化的XML文档,以聚合主要网站的内容。例如,一个读者可能会关注许多博客网站。如果这些博客站点支持RSS订阅,他只需要一个聚合器就可以订阅这些博客,然后他就可以在聚合器工具中看到所有博客的更新内容,而不是单独访问每个博客看看有没有内容更新。

在django中,内置了根据网站内容生成标准化XML文档的方法。接下来我们用这个方法实现RSS订阅文档。

例如,使用以下博客项目应用程序目录创建一个create.py

复制代码

blog/create.py

来自django . contrib . syndication . view import Feed

来自。模型导入后

类AllPostsRsscreate(提要):

#聚合阅读器上显示的标题

标题='姜戈博客'

#通过聚合阅读器跳转到网站地址

链接='/'

#聚合阅读器上显示的描述信息

描述='姜戈博客'

#要显示的内容项目

def项目(自):

返回Post.objects.all()

#聚合器中显示的内容项目的标题

def item_title(自身,项目):

返回“[% s]% s”%(item . category,item.title)

#聚合器中显示的内容项目的描述

def item_description(self,item):

返回项目.正文

复制代码

这段代码是指定生成XML文档,而逻辑仍然是获取对象列表,然后提取需要的数据('[%s]% s'%(项。类别,项目。标题),然后在模板中呈现和显示它。

这里视图更改后,继续在URL和前端模板中渲染。

简单的全文搜索

首先,全文搜索的对象是什么?存储在数据库中的信息。那么数据库信息查询的底层技术是什么呢?一定是算法。创建各种数据索引,加快查询速度,优化数据存储结构。

在前端表单中,我们需要使用表单的action属性的值作为{% url 'blog:search' %}(虽然我们还没有写这个视图函数),表示用户提交的结果会发送到博客应用下的搜索视图函数对应的url。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航