我正在一个网站上,用户可以发送朋友请求,接受请求,取消请求。我有一个错误AttributeError对象没有属性“删除”。当我取消好友请求时会发生这种情况。这是我尝试的代码:
型号:
class FriendRequest(models.Model):
to_user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, related_name='to_user')
from_user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, related_name='from_user')
date = models.DateTimeField(auto_now_add=True, null= True)
class Meta:
verbose_name = 'Friend request'
verbose_name_plural = 'Friend requests'
ordering = ['-date']
def __str__(self):
return "from {}, to {}".format(self.from_user.username, self.to_user.username)
Views.py:
@login_required
def cancel_friend_request_view(request, id):
user = get_object_or_404(User, id=id)
frequest = FriendRequest.objects.filter(from_user=request.user, to_user=user).first()
frequest.delete()
print(frequest)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
答案 0 :(得分:0)
.first()
将返回None
。
https://docs.djangoproject.com/en/3.0/ref/models/querysets/#first
请注意,first()是一种便捷方法,下面的代码示例与上面的示例等效:
try: p = Article.objects.order_by('title', 'pub_date')[0] except IndexError: p = None
[edit]您需要处理None
-情况,从上面的解释中应该已经很清楚了。另外,我建议学习使用python调试器来检查变量的类型,而不要依赖调试打印。
@login_required
def cancel_friend_request_view(request, id):
user = get_object_or_404(User, id=id)
frequest = FriendRequest.objects.filter(from_user=request.user, to_user=user)
if frequest is None:
raise Http404()
frequest.delete()
答案 1 :(得分:0)
我像这样解决了它(我不知道这是否是最好的方法,但它确实起作用了),删除了.first():
@login_required
def cancel_friend_request_view(request, id):
user = get_object_or_404(User, id=id)
frequest = FriendRequest.objects.filter(from_user=request.user, to_user=user)
frequest.delete()
print(frequest)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
答案 2 :(得分:0)
最好传递FriendRequest的ID,以完全跳过这段代码:
user = get_object_or_404(User, id=id)
frequest = FriendRequest.objects.filter(from_user=request.user, to_user=user).first()
您宁愿这样做:
friend_request = get_object_or_404(FriendRequest, id=id)
friend_request.delete()
还考虑不完全从数据库中删除数据,而是使用已删除的标志来保留整个软件的行为历史。