【问题标题】:How to Restricting one like per post in Django如何在 Django 中限制每个帖子的点赞数
【发布时间】:2019-11-11 18:53:07
【问题描述】:

我目前是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')

【问题讨论】:

  • 您是否考虑过创建另一个模型,其中您将拥有 Todo 和 User 模型作为 FK?这样您就可以跟踪哪个用户喜欢哪个 Todo。

标签: python django django-models django-forms django-views


【解决方案1】:

基本上我缺少的是保存与用户相对应的喜欢。正如 Paolo 所指出的,通过创建一个用户和主模型作为外键的模型很容易解决这个问题。

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)

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

【讨论】:

    【解决方案2】:

    我想尝试一下并扩展我的评论。

    我的建议是,创建一个新模型 Todo_Likes,它将 TodoUser 模型作为 Foreign Keys,以便能够跟踪谁喜欢 Todo

    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)
        # 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)
    

    views.py

    def like(request,todo_id):
        # Get user
        user = request.user
        # Get Todo object
        todo = Todo.objects.get(id=todo_id)
    
        # Check/Validate if current user has already liked the Todo. 
        # If not create a new Todo_Like object.
    
        todo_like = Todo_Like.objects.get(todo=todo, user=user)
    
        if not todo_like:
            # If the user haven't like the Todo object yet create a Todo_Like object.
            t = Todo_Like (
                todo=todo,
                user=user
                )
            t.save()
        else:
            # If the user has already liked the Todo then proceed to do
            # Whatever you want, redirect? message?
    

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

    1. 您可能会问您现在如何计算点赞数?回答:使用 Todo_Like.objects.count(),并确保按 Todo 进行计数。

    【讨论】:

    • 谢谢@Paolo 我创建了一个 Todo_Likes 模型,但我尝试了你的 views.py 并没有为我工作。但我能够让它工作并在这里发布我的代码。再次感谢!
    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2021-10-24
    • 2019-05-17
    • 2021-04-15
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多