個人博客開發-04(基於Python-3.8 + Django-2.2):視圖函數

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')

參考博客:

  1. 使用QuerySet查詢時,可以參考:Django QuerySet 進階
  2. 開發個人博客比較完整的一篇博客 django開發個人博客系統
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章