Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django限制每个帖子一个like_Python_Django_Django Models_Django Forms_Django Views - Fatal编程技术网

Python 如何在Django限制每个帖子一个like

Python 如何在Django限制每个帖子一个like,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,我目前是Django的初学者我想在我的so发帖类应用程序中限制每个帖子一个like,你可以发布一条文本,用户可以喜欢也可以不喜欢。现在我启用了登录,我希望登录的用户只喜欢一次帖子,但我没有成功 型号.py from django.db import models from django.contrib.auth.models import User # Create your models here. class Todo(models.Model): text = models.C

我目前是Django的初学者我想在我的so发帖类应用程序中限制每个帖子一个like,你可以发布一条文本,用户可以喜欢也可以不喜欢。现在我启用了登录,我希望登录的用户只喜欢一次帖子,但我没有成功

型号.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
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')
视图,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
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\u Likes
,它将
Todo
User
模型作为
外键
,以便能够跟踪谁喜欢
Todo

型号.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
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')
视图.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
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\u Like.objects.count(),并确保按Todo计算

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

    型号.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
    
    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')
    
    来自django.db导入模型的
    
    从django.contrib.auth.models导入用户
    类Todo(models.Model):
    text=models.CharField(最大长度=100)
    complete=models.BooleanField(默认值=False)
    定义(自我):
    返回self.text
    类待办事项(models.Model):
    todo=models.ForeignKey(todo,on_delete=models.CASCADE)
    user=models.ForeignKey(用户,on_delete=models.CASCADE)
    
    视图.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
    
    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')
    
    从django.shortcuts导入渲染,重定向
    从。模型导入Todo,Todo\u喜欢
    from.forms导入到表单
    def like(请求、待办事项id):
    user=request.user
    todo=todo.objects.get(id=todo\U id)
    like,created=Todo_likes.objects.get_或_create(#get_或_create将
    #自己做的工作
    #查找和创建(如果不存在)
    用户=用户,
    待办事项
    )
    如果未创建:
    return redirect('index')#如果之前存在错误,我不想显示任何错误。
    #我只是想改变方向。
    其他:
    返回重定向('索引')
    
    然后通过简单地进入我的索引视图并插入

    def索引(请求):
    form=TodoForm()
    todo\u list=todo.objects.order\u by('id'))
    likes=Todo_likes.objects.count()#添加此行
    上下文={'todo':todo_列表,'form':form,'likes':likes}
    返回呈现(请求'todolistapp/index.html',上下文)
    

    以及在我的模板中显示“likes”对象。

    您是否考虑过创建另一个模型,其中您将有Todo和用户模型作为FKs?这样你就可以跟踪哪个用户喜欢哪个Todo了。谢谢@Paolo我创建了一个Todo_Likes模型,但我尝试了your views.py,它对我不起作用。但我可以让它工作,并张贴我的代码在这里。再次感谢!