Django點贊的實現示例

1.前期準備

用戶models.py

class User(models.Model):
    username = models.CharField("用戶名",max_length=10)

點贊models.py
LikeNum的作用在於當有人點贊時可以把它記錄下來,包括點贊者和點贊的內容

# 喜歡數
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'

發佈models.py
Discusssion的作用在於渲染前端頁面,裡邊包括動態發佈人和被點贊數量

# 我的討論
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

# 討論點贊
def addLikes(request,id):
    # 識別出該登陸者用戶信息
    if request.session.get('username') and request.session.get('uid'):
        username = request.session.get('username')
        user = UserInfos.objects.get(username=username)
    else:
        # error 是自己寫的出錯頁面
        return HttpResponseRedirect('/error')
        
    # 判別點贊的該Discussion是否存在,有可能在你點贊的時候該用戶已經刪除,註意不能簡單的使用if,else當找不到discussion時會出錯
    try:
        if Discussion.objects.get(id=id):
            # 如果Discussion存在
            d = Discussion.objects.get(id=id)
            # 如果User存在
            if user:
                # 判斷當前用戶是否已經給該Discussion點過贊
                # record 為該記錄,不存在時則自動創建
                # flag 為當前是否操作
                record,flag = LikeNum.objects.get_or_create(user=user,discussion=d)
                # 如果剛剛創建
                if flag:
                    d.likes+=1
                    d.save()
                # 如果沒操作,說明之前點過贊,此時再次點贊說明是要取消點贊
                else:
                    d.likes -= 1
                    d.save()
                    # 並且刪除掉點贊記錄
                    LikeNum.objects.get(user=user,discussion=d).delete()
                # 跳轉到發佈頁面
                return render(request,'page.html',{'page':Discusssion.objects.all(),'ln':LikeNum.objects.fitter(user=user)})
            else:
                # 如果session中沒有用戶信息,則跳轉到登陸頁面
                return redirect('/login')  
    except Exception as e:
        # 否則跳轉到失敗頁面
        return HttpResponseRedirect('/error')

2.html實現

{% 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>
<!-- 請把我寫在這裡 3.js實現 --!>
{% endfor %}

3.js實現【!!!註意這段代碼寫在for循環之內】

//ln指likenum【點贊數】,因為點贊記錄是QuerySet,需要從裡邊遍歷
 {% if ln %} 
 // 遍歷
 {% for l in ln %} 
 // 當當前的discussion在LikeNum記錄裡時,為a標簽添加一個class
 {% if l.discussion == item %}
    <script>
        obj = document.getElementById('id{{item.id}}');
        obj.className = 'success';
    </script>
{% endif %} 
{%endfor%} 
{%endif%}

4.css實現

.success {
    color: #fc5531;
    text-decoration: none;
}

a {
    text-decoration: none;
    color: #848B96;
}

a:hover {
    color: #fc5531;
}

這隻是一個大概流程,具體的美化還需要自己實現,不懂得話可以留言來交流!

示意圖【我自己做出來的效果】

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

 到此這篇關於Django點贊的實現示例的文章就介紹到這瞭,更多相關Django 點贊內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: