
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篇实例教程中,大家将根据这个主视图开展模版的建立。
扫描二维码分享到微信