7.視圖函數
初學,寫寫筆記,權當交流,代碼也寫的不好~
本來是可以用模板繼承來減少代碼量的,但是前端繼承那裏繼承來繼承去顯示樣式都調試不合適~容我再去看看書了再來
from django.shortcuts import render, redirect
from .models import Blog, Category, Tag, Comment
import markdown
from django.contrib import messages
# 首頁
def index_handler(request):
context = {}
context['paihang_blog'] = Blog.objects.all().order_by('-viewsCount')[:2] # 點擊排行
context['blog_list'] = Blog.objects.all().order_by('-createDatetime') # 按照時間排序的博客
context['tag_list'] = Tag.objects.all() # 所有標籤
return render(request, 'index.html', context=context)
# 關於
def about_handler(request):
# 渲染到關於我頁面
return render(request, 'about.html')
# 博客詳細頁
def detail_handler(request, pk):
# 博客詳細頁需要傳入博客的id
context = {}
# 獲取到最後一篇博客
last_blog = Blog.objects.all().order_by('-createDatetime').reverse()[0]
# 獲取到第一篇博客
first_blog = Blog.objects.all().order_by('-createDatetime')[0]
# 獲取到當前瀏覽的博客
blog = Blog.objects.get(id=pk)
# 當調用博客詳細頁函數一次,則瀏覽量增加一次
blog.increase_views()
'''
此處判斷邏輯關係:
如果當前博客是最後一篇或第一篇,怎返回信息表明是最後一篇或第一篇,在前端代碼中判斷
如果是中間博客,遍歷所有博客,獲取當前博客的前一篇博客和後一篇博客
注:此處有一處bug,如果博客數量小於2篇,閱讀原文會報異常
'''
if last_blog == first_blog:
context['pre_message'] = '已經是第一篇'
context['next_message'] = '已經是最後一篇'
if blog == first_blog:
context['pre_message'] = '已經是第一篇'
context['next_blog'] = Blog.objects.all().order_by('-createDatetime')[1]
if blog == last_blog:
context['next_message'] = '已經是最後一篇'
context['pre_blog'] = Blog.objects.all().order_by('-createDatetime').reverse()[1]
i = 0
if Blog.objects.all().count() >= 3 and blog != last_blog and blog != first_blog:
for article in Blog.objects.all().order_by('-createDatetime'):
i = i + 1
if article == blog:
break
context['pre_blog'] = Blog.objects.all().order_by('-createDatetime')[i-2]
context['next_blog'] = Blog.objects.all().order_by('-createDatetime')[i]
# 獲取到博客之後,將其內容支持 markown語法和代碼高亮
blog.text = markdown.markdown(blog.text,
extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',
]
)
context = {
'blog':blog,
'blog_list':Category.objects.get(name=blog.category).category_set.all().order_by('-createDatetime'),
'tag_list':Tag.objects.all(),
'category_list':Category.objects.all(),
'paihang_blog':Blog.objects.all().order_by('-viewsCount')[:2]
}
return render(request, 'detail.html', context=context)
# 學無止境(博客列表)
def study_handler(request):
context = {
'blog_list':Blog.objects.all().order_by('-createDatetime'),
'tag_list':Tag.objects.all(),
'category_list':Category.objects.all(),
'paihang_blog':Blog.objects.all().order_by('-viewsCount')[:2],
'message':'學無止境'
}
return render(request, 'study.html', context=context)
# 留言
def message_handler(request):
context = {
'comment_list':Comment.objects.all().order_by('-created_time'),
'comment_sum':Comment.objects.all().count()
}
return render(request, 'message.html', context=context)
# 該標籤下的博客
def tag_handler(request, pk):
tag = Tag.objects.get(id=pk)
context = {
'blog_list':tag.tags_set.all().order_by('-createDatetime'),
'tag_list':Tag.objects.all(),
'category_list':Category.objects.all(),
'paihang_blog':Blog.objects.all().order_by('-viewsCount')[:2],
'message':tag.name
}
return render(request, 'study.html', context=context)
# 該分類下的博客
def category_handler(request, pk):
category = Category.objects.get(id=pk)
context = {
'blog_list':category.category_set.all().order_by('-createDatetime'),
'tag_list':Tag.objects.all(),
'category_list':Category.objects.all(),
'paihang_blog':Blog.objects.all().order_by('-viewsCount')[:2],
'message':category.name
}
return render(request, 'study.html', context=context)
# 搜索
def search_handler(request):
# 獲取搜索的關鍵詞
submit = request.GET.get('keyboard')
if not submit:
error_msg = "請輸入搜索關鍵詞"
messages.add_message(request, messages.ERROR, error_msg, extra_tags='danger')
# 若沒有關鍵詞,重定向到主頁
return redirect('index')
context = {
'blog_list':Blog.objects.filter(blogTitle__icontains=submit).order_by('-createDatetime'),
'tag_list':Tag.objects.all(),
'category_list':Category.objects.all(),
'paihang_blog':Blog.objects.all().order_by('-viewsCount')[:2],
'message':'學無止境'
}
return render(request, 'study.html', context=context)
# 留言提交
def form_handler(request):
if request.method == 'GET':
nickname = request.GET.get('nickname')
email = request.GET.get('email')
text = request.GET.get('lytext')
c = Comment()
c.nickname = nickname
c.text = text
c.email = email
c.save()
messages.add_message(request, messages.SUCCESS, '留言發表成功!', extra_tags='success')
return redirect('message')
def slowlife_handler(request):
return redirect('index')
參考博客:
- 使用QuerySet查詢時,可以參考:Django QuerySet 進階
- 開發個人博客比較完整的一篇博客 django開發個人博客系統