Django2训练新项目:开发设计本人blog系统软件(

这1篇实例教程,大家1起进行Django2本人blog系统软件的文章内容详细信息网页页面的內容一部分。

文章内容详细信息网页页面包括文章内容行为主体內容、评价內容和评价公布作用。

由于內容较为多,大家在这1篇先进行主视图一部分。

编码很长,不可以1次全放进来,那样会引发不适。

因此,我1段1段的渐渐地深层次,大伙儿1起体会这个全过程。

最先,大家必须导入Django出示的DetailView类,这是详细信息通用性主视图。

示例编码:

from django.views.generic import ListView, DetailView

上方编码中,鲜红色一部分是新增內容。

随后,大家界定文章内容详细信息类承继自DetailView类,并设定文章内容详细信息的文章内容行为主体內容一部分。

示例编码:

class ArticleDetail(DetailView):

model = Article

template_name = 'detail.html'

具体上,根据上方的编码,大家便可以融合URL设定和模版展现文章内容行为主体內容了。

但是,在文章内容详细信息页还必须显示信息评价內容。

评价內容的呈现实际效果以下:

大家来剖析1下。

这样的评价目录,其实不是彻底按评价的公布次序排列。

顶级评价是按公布次序,顶级评价下的回应是依照等级开展排列。

评价文章内容是顶级评价,回应1条文章内容的评价是2级评价,回应1条回应內容是3级评价,以此类推。

而评价数据信息储存到数据信息库时其实不是依照等级储存,因此大家必须将这些评价依照等级关联再次排序次序。

实际的思路以下:

遍历全部评价数据信息,假如是文章内容的评价(顶级)存入1个目录;

假如并不是文章内容的评价(也便是回应别人评价的评价),以评价总体目标(父级评价)的id为键存入字典。

循环系统遍历全部顶级评价,并根据递归涵数梳理每组评价內容(1个顶级评价和与之有关的回应评价),递归涵数的主要参数为父级评价。

递归的全过程不太非常容易了解,简易为大伙儿叙述1下。

启用递归涵数时,储存主要参数中传入的顶级评价到最后回到的评价目录,再根据这个顶级评价的id从字典中获得它的全部回应评价,随后开展递归;此时再度启用递归涵数,储存顶级评价的第1个回应评价,在根据这个回应评价的id获得这个回应评价的全部回应评价,再度递归,以此类推,直至找不到新的1层回应评价,完毕递归。

综上所述,大家必须在文章内容详细信息类(ArticleDetail)中界定有关的涵数。

示例编码:

def comment_sort(self, comments): # 评价排列涵数

self.comment_list = [] # 排列后的评价目录

self.top_level = [] # 储存顶级评价

self.sub_level = {} # 储存回应评价

for comment in comments: # 遍历全部评价

if comment.reply == None: # 假如沒有回应总体目标

self.top_level.append(comment) # 存入顶级评价目录

else: # 不然

self.sub_level.setdefault(comment.reply.id, []).append(comment) # 以回应总体目标(父级评价)id为键存入字典

for top_comment in self.top_level: # 遍历顶级评价

self.format_show(top_comment) # 根据递归涵数开展评价分类

return self.comment_list # 回到最后的评价目录

def format_show(self, top_comment): # 递归涵数

self.comment_list.append(top_comment) # 将主要参数评价存入目录

try:

self.kids = self.sub_level[top_comment.id] # 获得主要参数评价的全部回应评价

except KeyError: # 假如不存在回应评价

pass # 完毕递归

else: # 不然

for kid in self.kids: # 遍历回应评价

self.format_show(kid) # 开展下1层递归

进行了这两个涵数以后,大家便可以从数据信息库中获得当今文章内容的全部评价內容,开展分类排列,并整合到推送给模版的数据信息中。

示例编码:

def get_context_data(self, **kwargs):

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

comments = Comment.objects.filter(article=self.kwargs['pk']) # 根据文章内容id查寻评价內容

context['comment_list'] = self.comment_sort(comments) # 将排列分类后的文章内容目录存入传输到模版的数据信息中

return context

在上方编码中,标红一部分便是有关评价的显示信息內容。

此外,在文章内容详细信息页,大家还必须出示评价的作用。

评价作用的表单大家能够根据“ModelForm”开展建立。

提醒:具体上,在以后的实例教程中,由于应用了JQuery递交评价数据信息,这个表单并沒有进1步的功效,之因此在这里这么做,是以便给大伙儿详细介绍1些更多的內容。

在模版中大家融合了Bootstrap和JQuery,当大家应用Django表单时,怎样让全自动转化成的表模块素应用Bootstrap的款式呢?怎样让JQuery可以关系表单的元素呢?

新建1个表单文档“forms.py”,随后撰写编码。

示例编码:

from django import forms

from .models import Comment

class CommentForm(forms.ModelForm):

class Meta:

model = Comment

fields = ['name', 'email', 'content'] # 必须展现在网页页面上的表模块素

widgets = { # 界定字段对应的表模块素和特性

'name': forms.TextInput(attrs={'id': 'name', 'class': 'form-control', 'placeholder': '请键入昵称'}),

'email': forms.EmailInput(attrs={'id': 'email', 'class': 'form-control', 'placeholder': '请键入电子邮箱'}),

'content': forms.Textarea(attrs={'id': 'content', 'class': 'form-control', 'placeholder': '请键入评价內容'}),

}

在上方编码中,大家根据“widgets”界定了字段对应的表模块素,而且设定了特性。

特性中界定的“id”,是以便便捷JQuery获得和操纵元素的特性与值。

而特性中界定的“class”则是用来启用Bootstrap。

进行上方编码以后,大家便可以在主视图中应用这个表单了。

示例编码:

from .forms import CommentForm

def get_context_data(self, **kwargs):

...省略一部分编码...

comment_form = CommentForm() # 建立评价表单目标

context['comment_form'] = comment_form # 将表单目标传输到模版的数据信息中

return context

这篇实例教程就到这里,在下1篇实例教程中,大家将根据这个主视图开展模版的建立。



扫描二维码分享到微信