文章詳情頁(yè)
文章詳情頁(yè)中顯示文章的所有詳細(xì)信息
模板文件
?之前下載的博客模板中线得,找到article.html
文件够话,將其復(fù)制到templates/blog/
目錄中蓝翰。
$ cp article.html ~/fbckf/templates/blog/
<!-- blog-content -->
<div class="container content">
<div class="row justify-content-center">
<div class="col-8">
<div class="blog-header">
<h1 class="blog-title"><strong>{{ article.title }}</strong></h1>
<p class="blog-post-meta ">January 1, 2018 by <a href="#">{{ article.author }}</a></p>
</div>
<div class="blog-post border-bottom">
{{ article.body | safe }}
<img src="{% static 'blog/img/3.jpg' %}" style="width: 100%;">
</div>
<!-- 判斷用戶是否登陸,沒(méi)有登陸無(wú)法點(diǎn)贊和評(píng)論 -->
{% if username %}
<div class="center">
<button class="btn btn-outline-dark btn-lg" type="button" data-toggle="collapse" href="#post-comment" role="button" aria-expanded="false" aria-controls="post-comment">
<i class="fa fa-comment-o" aria-hidden="true"></i> 評(píng)論</button>
<button type="button" class="btn btn-lg btn-outline-danger" data-toggle="body" data-content="您是第 {{ article.likes }} 位喜歡這篇文章的讀者女嘲!">
<i class="fa fa-heart-o" aria-hidden="true"></i> 喜歡
</button>
<div class="collapse" id="post-comment">
<form action="#">
<div class="form-group">
<textarea name="comment" id="input-comment" cols="30" rows="5" class="form-control"></textarea>
</div>
<button class="btn btn-outline-dark" type="submit">發(fā)送</button>
</form>
</div>
</div>
{% endif %}
<div class="comment-list">
<div class="comment-detail">
<div class="row justify-content-start">
<img src="{% static 'blog/img/carousel2.jpg' %}" class="rounded" alt="user" style="width: 50px; height: 50px;">
<p class="lead col"> fbckf</p>
</div>
<div class="row justify-content-end">
<p class="col-11">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate velit, nam quo eveniet repellendus numquam, labore, fugit incidunt dicta enim perspiciatis et ab. Provident maiores non suscipit earum explicabo dolorum?</p>
</div>
<div class="row justify-content-end">
<ul class="list-group list-group-flush col-11" >
<li class="list-group-item">
<div class="row justify-content-start">
<img src="{% static 'blog/img/carousel2.jpg' %}" class="rounded" alt="user" style="width: 50px; height: 50px;">
<p class="lead col"> fbckf</p>
</div>
<div class="row justify-content-end">
<p class="col-11">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate velit, nam quo eveniet repellendus numquam, labore, fugit incidunt dicta enim perspiciatis et ab. Provident maiores non suscipit earum explicabo dolorum?</p>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
?以上和之前修改首頁(yè)模板時(shí)差不多畜份,不過(guò)要注意的一點(diǎn)是 {{ article.body | safe }}
標(biāo)簽中的 safe
。django會(huì)將文章內(nèi)容強(qiáng)制轉(zhuǎn)義澡为,所以有時(shí)會(huì)造成一些麻煩漂坏,加上 safe
表示該內(nèi)容安全,不需要轉(zhuǎn)義媒至。
添加 url 規(guī)則
# blog/urls.py
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.index, name='index'),
path('search/', views.search , name='search'),
# 添加文章詳情頁(yè) url 規(guī)則
path('article/<slug>/', views.article, name='article'),
]
?path()
中的第一個(gè)參數(shù)與之前又有不同,'<slug>'
中表示的是字符谷徙,在點(diǎn)擊文章的Read more
按鈕后會(huì)訪問(wèn) 127.0.0.1:8000/article/[文章名]/
這個(gè) url拒啰, 之后會(huì)將文章名保存變量 slug
中。具體的可以查看官方文檔完慧。
添加視圖函數(shù)
# blog/views.py
...
def article(request, slug):
context = {}
# 根據(jù) slug 的值獲取文章
article = Article.objects.get(title=slug)
context['article'] = article
if request.user.is_authenticated:
context['username']= request.user.username
return render(request, 'blog/article.html', context=context)
?要注意一點(diǎn)谋旦,這里是使用文章的 title
字段來(lái)獲取文章,所以模型的 title
字段必須具有唯一性屈尼,比如之前設(shè)在的 unique-True
册着。
?完成之后,在首頁(yè)點(diǎn)擊文章的 Read more
按鈕就會(huì)跳轉(zhuǎn)到那篇文章的詳情頁(yè)中脾歧。
點(diǎn)贊功能
?當(dāng)用戶點(diǎn)擊喜歡按鈕后甲捏,會(huì)彈出 “對(duì)話氣泡” 框,里面提示喜歡人數(shù)
添加視圖函數(shù)
?每次點(diǎn)擊時(shí)鞭执,文章的 likes
字段值加一
# blog/views.py
def like_article(request):
article_title = None
# 判斷是否時(shí) get 模式
if request.method == "GET":
article_title = request.GET['article_title']
article = Article.objects.get(title=article_title)
# 獲取到文章對(duì)象后司顿,更新 likes 字段的值
if article:
article.likes = article.likes + 1
article.save()
return HttpResponse(article.likes)
添加 url 規(guī)則
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.index, name='index'),
path('search/', views.search , name='search'),
path('article/<slug>/', views.article, name='article'),
path('like_article/', views.like_article, name='like_article'),
]
修改模板文件
...
<button id="like_article" value="{{ article.title }}" type="button" class="btn btn-lg btn-outline-danger" data-toggle="body" data-content="您是第 {{ article.likes|add:1 }} 位喜歡這篇文章的讀者芒粹!">
<i class="fa fa-heart-o" aria-hidden="true"></i> 喜歡
</button>
...
給
<button>
標(biāo)簽添加一個(gè)id
和value
屬性id
屬性是為了后面寫(xiě) ajax 準(zhǔn)備的value
的值是文章的標(biāo)題,ajax 將其傳遞到服務(wù)器{{ article.likes|add:1 }}
點(diǎn)擊之后顯示原likes
的值加一大溜,之后后臺(tái)進(jìn)行更新
ajax
?點(diǎn)擊按鈕之后化漆,通過(guò)使用 ajax 來(lái)異步訪問(wèn) url 進(jìn)行更新字段值。
...
$("#like_article").click(function(){
var article_title = $(this).attr("value");
$.get('/like_article/', {article_title:article_title}, function(data){
$("#like_article").attr('disabled', true);
});
});
...
$.get()
方法第一個(gè)參數(shù)為 url 第二個(gè)參數(shù)是傳遞數(shù)據(jù) 第三個(gè)是函數(shù)钦奋,收到返回結(jié)果之后執(zhí)行的內(nèi)容傳遞的數(shù)據(jù)會(huì)以
get
模式傳遞到后臺(tái)點(diǎn)擊后給按鈕添加 disabled 屬性 防止用戶連續(xù)點(diǎn)擊
?每次打開(kāi)文章頁(yè)面之后座云,如果登陸了賬戶,則可以個(gè)文章點(diǎn)贊付材,但是每個(gè)用戶只能點(diǎn)擊一次疙教。
總結(jié)
?文章頁(yè)的功能還沒(méi)有全部完成,包括 markdown 語(yǔ)法和評(píng)論功能