Django點(diǎn)贊的實(shí)現(xiàn)示例
1.前期準(zhǔn)備
用戶models.py
class User(models.Model): ? ? username = models.CharField("用戶名",max_length=10)
點(diǎn)贊models.py
LikeNum的作用在于當(dāng)有人點(diǎn)贊時(shí)可以把它記錄下來(lái),包括點(diǎn)贊者和點(diǎn)贊的內(nèi)容
# 喜歡數(shù) class LikeNum(models.Model): ? ? user = models.ForeignKey(UserInfos,null=True,on_delete=models.SET_NULL) ? ? discussion = models.ForeignKey(Discussion,null=True,on_delete=models.SET_NULL) ? ? class Meta: ? ? ? ? verbose_name_plural = 'user'
發(fā)布models.py
Discusssion的作用在于渲染前端頁(yè)面,里邊包括動(dòng)態(tài)發(fā)布人和被點(diǎn)贊數(shù)量
# 我的討論 class Discussion(models.Model): ? ? user = models.ForeignKey(UserInfos,null=True,on_delete=models.SET_NULL) ? ? likes = models.PositiveIntegerField("喜歡",default=0,editable=False) ? ? class Meta: ? ? ? ? verbose_name_plural = 'Discussion'
views.py
# 討論點(diǎn)贊 def addLikes(request,id): ?? ?# 識(shí)別出該登陸者用戶信息 ? ? if request.session.get('username') and request.session.get('uid'): ? ? ? ? username = request.session.get('username') ? ? ? ? user = UserInfos.objects.get(username=username) ? ? else: ? ? ?? ?# error 是自己寫(xiě)的出錯(cuò)頁(yè)面 ? ? ?? ?return HttpResponseRedirect('/error') ? ? ?? ? ? ? # 判別點(diǎn)贊的該Discussion是否存在,有可能在你點(diǎn)贊的時(shí)候該用戶已經(jīng)刪除,注意不能簡(jiǎn)單的使用if,else當(dāng)找不到discussion時(shí)會(huì)出錯(cuò) ? ? try: ? ? ? ? if Discussion.objects.get(id=id): ? ? ? ? ?? ?# 如果Discussion存在 ? ? ? ? ? ? d = Discussion.objects.get(id=id) ? ? ? ? ? ? # 如果User存在 ? ? ? ? ? ? if user: ? ? ? ? ? ? ?? ?# 判斷當(dāng)前用戶是否已經(jīng)給該Discussion點(diǎn)過(guò)贊 ? ? ? ? ? ? ?? ?# record 為該記錄,不存在時(shí)則自動(dòng)創(chuàng)建 ? ? ? ? ? ? ?? ?# flag 為當(dāng)前是否操作 ? ? ? ? ? ? ? ? record,flag = LikeNum.objects.get_or_create(user=user,discussion=d) ? ? ? ? ? ? ? ? # 如果剛剛創(chuàng)建 ? ? ? ? ? ? ? ? if flag: ? ? ? ? ? ? ? ? ? ? d.likes+=1 ? ? ? ? ? ? ? ? ? ? d.save() ? ? ? ? ? ? ? ? # 如果沒(méi)操作,說(shuō)明之前點(diǎn)過(guò)贊,此時(shí)再次點(diǎn)贊說(shuō)明是要取消點(diǎn)贊 ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? d.likes -= 1 ? ? ? ? ? ? ? ? ? ? d.save() ?? ??? ??? ??? ? ? ?# 并且刪除掉點(diǎn)贊記錄 ?? ??? ? ? ? ? ? ? ?LikeNum.objects.get(user=user,discussion=d).delete() ?? ??? ? ? ? ? ?# 跳轉(zhuǎn)到發(fā)布頁(yè)面 ? ? ? ? ? ? ? ? return render(request,'page.html',{'page':Discusssion.objects.all(),'ln':LikeNum.objects.fitter(user=user)}) ? ? ? ? ? ? else: ? ? ? ? ? ? ?? ?# 如果session中沒(méi)有用戶信息,則跳轉(zhuǎn)到登陸頁(yè)面 ? ? ? ? ? ? ? ? return redirect('/login') ? ? ? except Exception as e: ? ? ? ? # 否則跳轉(zhuǎn)到失敗頁(yè)面 ? ? ? ? return HttpResponseRedirect('/error')
2.html實(shí)現(xiàn)
{% for item in page %} <div> ?? ?用戶名:{{item.user.username}} ? <a id="id{{item.id}}"> ? ? ? ?<svg class="icon" aria-hidden="true"> ? ? ? ? ? ? ? ?<use xlink:href="#icon-like-fill" rel="external nofollow" ></use> ? ? ? ? ? ?</svg> ? ? ? ?<span id="nlikes">{{item.likes}}</span> ? ?</a> </div> <!-- 請(qǐng)把我寫(xiě)在這里 3.js實(shí)現(xiàn) --!> {% endfor %}
3.js實(shí)現(xiàn)【?。。∽⒁膺@段代碼寫(xiě)在for循環(huán)之內(nèi)】
//ln指likenum【點(diǎn)贊數(shù)】,因?yàn)辄c(diǎn)贊記錄是QuerySet,需要從里邊遍歷 ?{% if ln %}? ?// 遍歷 ?{% for l in ln %}? ?// 當(dāng)當(dāng)前的discussion在LikeNum記錄里時(shí),為a標(biāo)簽添加一個(gè)class ?{% if l.discussion == item %} ?? ?<script> ?? ? ? ?obj = document.getElementById('id{{item.id}}'); ?? ? ? ?obj.className = 'success'; ?? ?</script> {% endif %}? {%endfor%}? {%endif%}
4.css實(shí)現(xiàn)
.success { ? ? color: #fc5531; ? ? text-decoration: none; } a { ? ? text-decoration: none; ? ? color: #848B96; } a:hover { ? ? color: #fc5531; }
這只是一個(gè)大概流程,具體的美化還需要自己實(shí)現(xiàn),不懂得話可以留言來(lái)交流!
示意圖【我自己做出來(lái)的效果】
到此這篇關(guān)于Django點(diǎn)贊的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Django 點(diǎn)贊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django錯(cuò)誤:TypeError at / ''bool'' object is not callable解決
這篇文章主要介紹了Django 錯(cuò)誤:TypeError at / 'bool' object is not callable解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python實(shí)戰(zhàn)之夢(mèng)幻鋼琴小游戲的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言編寫(xiě)一款界面化的(Tkinter)電子鋼琴小程序,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-02-02python3應(yīng)用windows api對(duì)后臺(tái)程序窗口及桌面截圖并保存的方法
今天小編就為大家分享一篇python3應(yīng)用windows api對(duì)后臺(tái)程序窗口及桌面截圖并保存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08pandas進(jìn)階教程之Dataframe的apply方法
DataFrame中的apply方法就是將函數(shù)應(yīng)用到由列或行形成的一維數(shù)組上,下面這篇文章主要給大家介紹了關(guān)于pandas進(jìn)階教程之Dataframe的apply方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09關(guān)于Django顯示時(shí)間你應(yīng)該知道的一些問(wèn)題
將Django項(xiàng)目部署到Linux系統(tǒng)上進(jìn)行測(cè)試時(shí),發(fā)現(xiàn)操作記錄的時(shí)間與服務(wù)器的時(shí)間不一致,相差13個(gè)小時(shí)。這主要是因?yàn)闀r(shí)區(qū)的問(wèn)題,下面這篇文章主要總結(jié)介紹了關(guān)于Django顯示時(shí)間你應(yīng)該知道的一些問(wèn)題,需要的朋友可以參考下。2017-12-12python機(jī)器學(xué)習(xí)pytorch?張量基礎(chǔ)教程
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)pytorch?張量基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10python同時(shí)遍歷數(shù)組的索引和值的實(shí)例
今天小編就為大家分享一篇python同時(shí)遍歷數(shù)組的索引和值的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11人工智能——K-Means聚類算法及Python實(shí)現(xiàn)
這篇文章主要介紹了人工智能——K-Means聚類算法及Python實(shí)現(xiàn),一個(gè)能夠找到我圈出的這?些點(diǎn)集的算法,就被稱為聚類算法,下面就來(lái)看看文章具體的介紹吧2022-01-01