Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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 只希望用户';比如';一次评论。我的代码不起作用_Python_Django_Django Models_Django Views - Fatal编程技术网

Python 只希望用户';比如';一次评论。我的代码不起作用

Python 只希望用户';比如';一次评论。我的代码不起作用,python,django,django-models,django-views,Python,Django,Django Models,Django Views,我有一个Post模型,上面有一个字段,像_total。我只希望用户能够喜欢一篇文章一次,但是视图中的代码不起作用。代码如下: views.py def like(request, post_id, group_id): group = get_object_or_404(Group, pk= group_id) post = get_object_or_404(Post, pk= post_id) likers = [] if request.method =

我有一个Post模型,上面有一个字段,像_total。我只希望用户能够喜欢一篇文章一次,但是视图中的代码不起作用。代码如下:

views.py

def like(request, post_id, group_id):
    group = get_object_or_404(Group, pk= group_id)
    post =  get_object_or_404(Post, pk= post_id)
    likers = []

    if request.method == 'POST':
        if request.user in likers:
            return render(request, 'groups/detail.html', {'group':group, 'error': "you have already liked this post"} )
        else:
            post.likes_total += 1
            post.save()
            likers.append(request.user)
            return redirect('/groups/' + str(group_id) )
        # post.save()
    else:
        return render(request, 'groups/detail.html', {'group':group})

这个代码对我来说似乎是对的,我不知道问题出在哪里。。任何帮助都将不胜感激

每次调用函数时,都会将likers设置为空。相反,它应该是帖子的一个属性

您的
likers
列表不会在任何地方持久化,并且它总是初始化为空列表,因此
请求。user
将永远不会在列表中


您应该编辑模型,使每个
Post
对象都有一个喜欢它的用户列表,然后您可以保存、更新和检查该列表,以确保每个用户最多只喜欢一次每个Post。

您可以在
like
函数中定义一个名为
likers
的列表。这意味着每次有人调用
like
函数时,您都会构造一个新的空列表

您可以在函数外部构造列表,但这也没有帮助。事实上,您可以考虑持久性的唯一数据(可以插入/修改/删除的数据,以便下一次调用可以看到这种差异)在数据库中。

因此,您应该让数据库存储喜欢帖子的人,例如,向引用喜欢帖子的用户的
post
模型添加
ManyToManyField
。因此,您应该编辑模型:

class Post(Model):

    likers = ManyToManyField(User)
    # some other fields
    likes_total = IntegerField()
班级职位(模型):
likers=ManyToManyField(用户)
#其他一些领域
likes\u total=IntegerField()
现在我们可以将喜欢帖子的用户添加到多对多关系中:

def like(request, post_id, group_id):
    group = get_object_or_404(Group, pk= group_id)
    post =  get_object_or_404(Post, pk= post_id)

    if request.method == 'POST':
        if request.user in post.likers.all():
            return render(request, 'groups/detail.html', {'group':group, 'error': "you have already liked this post"} )
        else:
            post.likes_total += 1
            post.likers.add(request.user)
            post.save()
            return redirect('/groups/' + str(group_id) )
    else:
        return render(request, 'groups/detail.html', {'group':group})
def-like(请求、发布id、组id):
组=获取对象或404(组,主键=组id)
post=获取对象或404(post,pk=post\U id)
如果request.method==“POST”:
如果post.likers.all()中的request.user:
返回呈现(请求'groups/detail.html',{'group':组,'error':“您已经喜欢这篇文章了”})
其他:
post.u总计+=1
post.likers.add(request.user)
post.save()
返回重定向('/groups/'+str(group_id))
其他:
返回呈现(请求'groups/detail.html',{'group':group})

您可以做的另一个改进是使用
reverse
生成URL,而不是自己构建URL。

但这里使用的是本地列表。您知道数据库是Web服务器中唯一的持久数据吗?