Python 如何在Django限制每个帖子一个like
我目前是Django的初学者我想在我的so发帖类应用程序中限制每个帖子一个like,你可以发布一条文本,用户可以喜欢也可以不喜欢。现在我启用了登录,我希望登录的用户只喜欢一次帖子,但我没有成功 型号.pyPython 如何在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
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')
我也想提前回答一个问题
基本上我缺少的是保存对应于用户的喜好。正如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,它对我不起作用。但我可以让它工作,并张贴我的代码在这里。再次感谢!