url的設計 /usrname/article/1 /用戶名/article/文章主鍵值 re_path(r'^(?P<username>\w+)/article/(?P<article_id>\d+)/$',views.article_detail,name='detail'), 視圖函數的設計 ...
url的設計
/usrname/article/1
/用戶名/article/文章主鍵值
re_path(r'^(?P<username>\w+)/article/(?P<article_id>\d+)/$',views.article_detail,name='detail'),
視圖函數的設計
# 七、文章詳情頁
def article_detail(request,username,article_id):
# 是為了文章詳情頁站點的標題能夠有顯示
user_obj = models.UserInfo.objects.filter(username=username).first()
blog = user_obj.blog
# 1.先驗證當前的url是否可以使用,以防被上方的url頂替
# return HttpResponse('ok')
# 2.獲取當前的文章對象,註意在這之前可以先判斷一下用戶輸入的username、article_id是否存在,不存在保錯
# 註意這裡需要加一個用戶名參數,以防用戶名不對時也可以訪問到主鍵為1的文章
article_obj = models.Article.objects.filter(pk=article_id,blog__userinfo__username=username).first()
if not article_obj:
return render(request,'error.html')
return render(request,'article_detail.html',locals())
前端文章詳情頁設計
{% extends 'base.html' %} # 個人站點頁面和文章詳情頁都繼承自base頁面
{% block content %}
<h3 class="text-center">{{ article_obj.title }}</h3>
<div class="article_content">
{{ article_obj.content }}
</div>
{% endblock %}
這裡繼承之後,右側的側邊欄就不見了,需要將側邊欄需要的數據在導入到文章詳情的視圖函數,但是這往往比較麻煩。
所有,我們可以將文章詳情頁製成一個inclusion_tag,方便後面需要側邊欄的時候直接導入進行!詳見將側邊欄製成inclusion_tag