135-使用django實現點贊功能


大前提:點贊並不設計表單提交,在模板里已經有某個表單的情況下,點贊本身不需要使用表單來實現,而且可以說非常不推薦表單來實現。

我的點贊邏輯是:一個id對一篇文章只能點贊一次,自己不能對自己點贊。

 

【1】視圖函數。除了顯示必然的內容之外,還需要傳遞一個關於點贊的重要變量:

# 注意:一定是從首頁點擊進去的
# 為了避免直接在url里改編號,顯示其他內容,還必須加上開放判斷
@login_required
def op_one_note(request, pk):
    current_user = request.user
    pk_note = get_object_or_404(MyNote, open_bool=True, id=pk)
    if request.method != 'POST':
        comment_form = CommentForm()
        note_all_comment = pk_note.comment_note.all().order_by('-add_time')
        if_praise = Praise.objects.filter(note=pk_note.title, user=current_user.username).exists()
        # print(if_praise)
        context = {'pk_note': pk_note, 'note_all_comment': note_all_comment, 'comment_form': comment_form,
                   'if_praise': if_praise}
        return render(request, 'op_one_note.html', context)

    else:
        form = CommentForm(request.POST)
        if form.is_valid():
            new_comment = form.save(commit=False)
            new_comment.relation_note = pk_note
            new_comment.author = current_user.username
            new_comment.save()
            pk_note.comment_num += 1
            pk_note.save()
            return HttpResponseRedirect(reverse('notebook:op_one_note', args=[pk]))

 

這里有一個非常關鍵的表達式:

if_praise = Praise.objects.filter(note=pk_note.title, user=current_user.username).exists()

這個地方用來判斷:在所有已經存儲的點贊記錄里,是否有文章和用戶名已經存在的模型。為什么這么做?先請記住:if_praise

 

【2】點贊的類。下面看一下如何定義的:點贊類包括3個屬性:文章,用戶,時間。

class Praise(models.Model):
    note = models.CharField(max_length=512, blank=True, null=True)
    user = models.CharField(max_length=256, blank=True, null=True)
    time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.note, 'by', self.user

 

 

【3】模板,介紹一下如何實現點贊:

        {# add a praise #}
        <div id="praise">
            {% if request.user.username != pk_note.author %}
                {% if if_praise %}
                    <p>already praise!</p>
                {% else %}
                    <a href="{% url 'notebook:get_praise' pk_note.pk %} ">praise!</a>
                {%endif %}
            {% endif %}
        </div>

 

這里很明確:只有當前用戶不等於這篇文章的作者時,才能進行點贊相關判斷。接着,如果之前提到的那個if_praise為真,表明已經點過贊了,此時不能操作僅提示,如果為假,則使用一個“鏈接”來完成點贊。

鏈接指向一個函數,並傳遞當前note的pk值。

 

【4】函數。用一個函數對點贊模型進行存儲,然后重定向到當前頁面。

def get_praise(request, pk):
    current_user = request.user
    pk_note = get_object_or_404(MyNote, open_bool=True, id=pk)
    new_praise = Praise()
    new_praise.note = pk_note.title
    new_praise.user = current_user.username
    new_praise.save()
    pk_note.praise_count += 1
    pk_note.save()
    return HttpResponseRedirect(reverse('notebook:op_one_note', args=[pk]))

 

這個函數照例要先獲取當前的用戶和文章,然后對點贊模型進行存儲,然后將點贊數+1,再對文章模型進行存儲。最后就是重定向,重新打開這個頁面,並再一次判斷點贊情況。

 

這就是點贊的實現,是不是很簡單,還思路清晰!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM