这是我正在使用的视图功能
views.py
def favorite_item (request, pk):
favitem = get_object_or_404(Item, pk=pk)
userfav = Favorite.objects.filter(user=request.user)
for items in userfav:
if items.item == favitem:
items.delete()
else:
new_entry = Favorite(item=favitem, user=request.user)
new_entry.save()
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
删除已存在的部分行完美运行:
if items.item == favitem:
items.delete()
但我认为问题在于我尝试添加新行,只返回任何内容,甚至没有提出错误!
else:
new_entry = Favorite(item=favitem, user=request.user)
new_entry.save()
答案 0 :(得分:1)
逻辑可能已经关闭。 favitem
可能是用户想要收藏/不喜欢的项目。此外,userfav
是该用户最喜欢的项目列表。
if
- else
循环中的for
子句
但是你开始迭代在那个列表上。如果Favorite
是收藏的项目,则将其删除(这可能是正确的)。但是如果用户的收藏夹列表中的项目不是该用户的最爱,那么您添加另一个Favorite
对象,所以现在有两个 Favorites
将此元素与用户链接。
您可能只想执行else
部分,以防if
部分从未执行过(即无循环)。我们可以使用for
- else
构造:
for items in userfav:
if items.item == favitem:
items.delete()
break
else:
new_entry = Favorite(item=favitem, user=request.user)
请注意,此处else
与for
循环. And the
中断is crucial, since this will make sure the
其他部分处于同一级别未已解雇
但是我们太难了。我们可以简单地让Django执行过滤,并删除收藏夹。我们也可filter(..)
item
上的Favorite
查询集,并删除这些条目。如果没有删除条目,我们可以添加这样的def favorite_item (request, pk):
favitem = get_object_or_404(Item, pk=pk)
num, __ = Favorite.objects.filter(user=request.user, item=favitem).delete()
if not num:
new_entry = Favorite.objects.create(item=favitem, user=request.user)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
条目:
num
因此,此处Favorite
将包含已删除的Favorite
条目数。如果不是零,我们删除了一个或多个用户为request.user
的{{1}},item
为favitem
。
如果num
不为零,我们会.create(..)
新的Favorite
。
Favorite
模型您还可以更好地约束您的Favorite
模型。现在,看起来用户可以使相同 Item
Favorite
多次次。您最好使用unique_together
来防止:
class Favorite(models.Model):
item = ForeignKey(Item, on_delete=models.CASCADE)
user = ForeignKey(User, on_delete=models.CASCADE)
class Meta:
unique_together = (('item', 'user'), )
当然,我在这里对Favorite
模型的外观做了一些假设。然而,重要的部分是unique_together
。
如果我们添加了这样的约束,我们知道对于.filter(user=..., item=...)
,总会有最多一个这样的元素。所以在这种情况下,逻辑更简单:
def favorite_item (request, pk):
favitem = get_object_or_404(Item, pk=pk)
try:
Favorite.objects.get(user=request.user, item=favitem).delete()
except Favorite.DoesNotExist:
new_entry = Favorite.objects.create(item=favitem, user=request.user)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))