在本地配置host后,用域名访问会出现Invalid Host header 解决方法:在vue-cli版本为2.x的情况下修改vue.config.js中的devServer对象加入disableH
顺晟科技
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。
29
2021-08
29
2021-08
29
2021-08
16
2021-06
16
2021-06
16
2021-06