大前提:點贊並不設計表單提交,在模板里已經有某個表單的情況下,點贊本身不需要使用表單來實現,而且可以說非常不推薦表單來實現。
我的點贊邏輯是:一個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,再對文章模型進行存儲。最后就是重定向,重新打開這個頁面,並再一次判斷點贊情況。
這就是點贊的實現,是不是很簡單,還思路清晰!!!