Django ブログサイト views/detail.py 詳細画面ビュー
2020/07/04 (更新:2020/11/19)
詳細画面のビューです。
詳細画面
テンプレート拡張共通部品CommonMixinとDetailViewを継承し実装します。
詳細画面表示時、ブログの閲覧数を更新します。
detail
class BlogDetail(base.CommonMixin, generic.DetailView):
model = models.Post
def get_queryset(self):
queryset = super().get_queryset()
queryset = queryset.filter(author=self.kwargs['author'].id)
if not self.request.user.is_authenticated:
queryset = queryset.filter(status__gte=models.PostStatus.PUBLIC)
return queryset
def get_object(self):
obj = super().get_object()
if not self.request.user.is_authenticated:
obj.view_count += 1
obj.save()
obj.categories = list(obj.postcategory_set.all())
obj.content = obj.postcontent_set.get(language_code=self.request.LANGUAGE_CODE,)
comment_status = models.CommentStatus.UNAPPROVED if self.request.user.is_authenticated else models.CommentStatus.APPROVED
if obj.is_comment:
comments = list(obj.comment_set.filter(status__gte=comment_status))
parents = []
replydict = dict()
for comment in comments:
comment.status_name = str(models.CommentStatus(comment.status))
if comment.parent:
replies = replydict.get(comment.parent.id, [])
replies.append(comment)
replydict[comment.parent.id] = replies
else:
parents.append(comment)
for comment in parents:
comment.replies = replydict.get(comment.id)
obj.comments = parents
obj.is_comment_edit = common.has_perm(
self.request,
constants.PERMISSION_COMMENT_EDIT,
post=obj,
author=self.kwargs['author']
)
obj.is_comment_reply = common.has_perm(
self.request,
constants.PERMISSION_COMMENT_REPLY,
post=obj,
author=self.kwargs['author']
)
self.template_name = utils.get_template_path(self.request, self.kwargs['author_name'], obj.template_text)
return obj
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comment_form'] = forms.CommentForm(None)
logging.getLogger(constants.OPERATION_LOG).info({'post':self.object.id})
return context
def get_template_names(self):
template_names = super().get_template_names()
language_codes = common.get_post_language_codes(self.object.id)
self.kwargs['available_languages'] = utils.get_languages(self.request, language_codes)
return template_names