如何在Django中限制每个帖子的赞数

我目前是Django的初学者。 我想在我的“发布”应用程序中限制每个帖子的“赞”次数,您可以在其中发布文本,用户可以喜欢或不喜欢相同的文本。现在,我启用了登录功能,并且希望登录的用户仅对帖子发一次赞,但操作失败。

Models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Todo(models.Model):
    text = models.CharField(max_length=100)
    complete = models.BooleanField(default=False)
    like=models.IntegerField(default=0)
    user = models.ForeignKey(User)

    def __str__(self):
        return self.text

观看次数,py

def like(request,todo_id):
    if Todo.objects.filter(todo_id = todo_id,user_id=request.user.id).exists():
        return redirect('index')
    else:
        todo = Todo.objects.get(pk=todo_id)
        todo.like += 1
        todo.save()
        return redirect('index')
baanwcw 回答:如何在Django中限制每个帖子的赞数

基本上我所缺少的是保存与用户对应的点赞。就像Paolo指出的那样,通过使用User和main模型作为外键来创建模型,可以轻松解决此问题。

models.py

from django.db import models
from django.contrib.auth.models import User

class Todo(models.Model):
    text = models.CharField(max_length=100)
    complete = models.BooleanField(default=False)

    def __str__(self):
        return self.text

class Todo_likes(models.Model):
    todo = models.ForeignKey(Todo,on_delete=models.CASCADE)
    user = models.ForeignKey(User,on_delete=models.CASCADE)

views.py

from django.shortcuts import render,redirect
from .models import Todo,Todo_likes
from .forms import TodoForm

def like(request,todo_id):
    user = request.user
    todo = Todo.objects.get(id=todo_id)
    like,created = Todo_likes.objects.get_or_create(   # get_or_create will 
                                                        # itself do the job of 
                                                        # finding and creating if not exist
        user = user,todo = todo
    )
    if not created:
        return redirect('index') #I don't wanted to show any error if existed earlier.
                                 #I just wanted to redirect.

    else:
        return redirect('index') 

然后通过简单地进入“索引”视图并插入

来计算喜欢的次数
def index(request):
    form = TodoForm()
    todo_list = Todo.objects.order_by('id')
    likes = Todo_likes.objects.count()  # Adding this line
    context= {'todo' : todo_list,'form':form,'likes' : likes} 
    return render(request,'todolistapp/index.html',context)

并在模板中显示“喜欢”对象。

,

我想尝试一下,扩大我的评论。

我的建议是,创建一个新模型Todo_Likes,它将同时将TodoUser模型都设为Foreign Keys,以便能够追踪谁喜欢{{1 }}。

models.py

Todo

views.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Todo(models.Model):
    text = models.CharField(max_length=100)
    complete = models.BooleanField(default=False)
    # Got rid of the user FK and like since I would count likes using
    # Todo_Like.objects.count()

    def __str__(self):
        return self.text

class Todo_Like(models.Model):
    todo = models.ForeignKey(Todo)
    user = models.ForeignKey(User)

我也想提前回答一个问题。

  1. 您可能会问您现在如何计算点赞次数?答案:利用Todo_Like.objects.count(),并确保您按Todo进行计数。
本文链接:https://www.f2er.com/3121972.html

大家都在问