试图添加一个项目到我的监视列表突然开始返回一个错误

没有与给定查询匹配的监视列表.

下面是我的代码.

models.py

class Listing(models.Model):
    product_name = models.CharField(max_length=64, verbose_name="product_name")
    product_description = models.TextField(max_length=200, verbose_name="product description")
    product_image = models.ImageField(upload_to="images/", verbose_name="image", blank=True)
    is_active = models.BooleanField(blank=False, default=True)
    initial_price = models.DecimalField(decimal_places=2, max_digits=6, default=False)
    owner = models.ForeignKey(User, related_name="auction_owner", on_delete=models.CASCADE, default=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="category")
    
    def __str__(self):
        return self.product_name

class Watchlist(models.Model):
    user = models.OneToOneField(User, on_delete=models.DO_NOTHING)
    items = models.ManyToManyField(Listing, null=True, related_name="watchlist_item")

views.py

def add_to_watchlist(request, item_id):
item = get_object_or_404(Listing, pk=item_id)
user_watchlist = get_object_or_404(Watchlist, user=request.user)
user_watchlist.items.add(item)
return redirect("watchlist")

urls.py

path("add_to_watchlist/<int:item_id>", views.add_to_watchlist, name="add_to_watchlist"),

template

<div class="btn-groups">
      {% if listing in watchlist_items %}
      <a href="{% url 'remove_from_watchlist' item_id=listing.id %}" class="fas fa-shopping-cart"><button type = "button" class = "add-cart-btn">remove from watchlist</button></a>
      {% else %}
      <a href="{% url 'add_to_watchlist' item_id=listing.id %}" class="fas fa-shopping-cart"><button type = "button" class = "add-cart-btn">add to watchlist</button></a>
      {% endif %}
</div>

推荐答案

这是因为对于该用户,没有添加Watchlist yet,如果缺少,您可以创建一个:

def add_to_watchlist(request, item_id):
    item = get_object_or_404(Listing, pk=item_id)
    user_watchlist, __ = Watchlist.objects.get_or_create(user=request.user)
    user_watchlist.items.add(item)
    return redirect('watchlist')

Note:Section 9 of the HTTP protocol 指定像GET和HEAD这样的请求not应该有副作用,因此 不应通过此类请求更改实体.通常为POST、PUT、PATCH和 删除请求用于此目的.在这种情况下,你会得到一个小的<form> 将触发POST请求,或者您使用一些AJAX调用.某些浏览器会查找 链接,并且已经详尽地缓存了这些链接的响应,所以这些可能 引发这样的观点会产生副作用.

Django相关问答推荐

升级到4.2时,获取默认文件存储/存储是互斥的

使用自定义模型注册后,Django无法登录

在Python中向函数的查询列表添加条件

当使用django-tinymce时,我在哪里指定referer?

在 Django 中按月份和年份对帖子进行分类

如何组织 Django REST Framework url

如何在视图中的 Django 重定向末尾附加字符串?

是否可以在没有模型的情况下创建自定义管理视图

获取 Django 中的缓存键列表

在 Django 过滤器语句中,__exact 和等号 (=) 有什么区别?

一个简单的Django和CSS示例

Django REST 异常

是否可以将 FastAPI 与 Django 一起使用?

Django:获取上次用户访问日期

AngularJS + Django Rest Framework + CORS(CSRF Coo​​kie 没有出现在客户端)

Django 模板和变量属性

在 docker 容器中创建 django 超级用户而不输入密码

如何在 Django 中执行批量插入?

django-rest-framework 接受 JSON 数据?

Django:在模块中实现 status字段的最佳方式