Python 我无法在Django应用程序中使用最喜欢和最不喜欢的视图

Python 我无法在Django应用程序中使用最喜欢和最不喜欢的视图,python,django,django-models,django-views,django-forms,Python,Django,Django Models,Django Views,Django Forms,我正在尝试在我的应用程序中实现一些最喜欢的函数。但是当使用get_objects_或_404时,我得到了一个奇怪的错误 我试图让用户单击图标将产品添加到收藏夹列表中,在我下面的教程中,我注意到只有当他拥有帖子详细信息时才有可能这样做,因此他只添加了在帖子详细信息页面上单击图标将帖子添加到收藏夹的访问权限,因此他能够执行类似“post=get\u object\u或\u 404”的操作(Post,id=id)“将id传递到请求中。但我的情况不同,我将所有产品都放在一个页面上,并且我没有使用产品详细

我正在尝试在我的应用程序中实现一些最喜欢的函数。但是当使用get_objects_或_404时,我得到了一个奇怪的错误


我试图让用户单击图标将产品添加到收藏夹列表中,在我下面的教程中,我注意到只有当他拥有帖子详细信息时才有可能这样做,因此他只添加了在帖子详细信息页面上单击图标将帖子添加到收藏夹的访问权限,因此他能够执行类似“post=get\u object\u或\u 404”的操作(Post,id=id)“将id传递到请求中。但我的情况不同,我将所有产品都放在一个页面上,并且我没有使用产品详细信息页面,因此我希望用户也能够单击产品页面上的图标

models.py

class Product(models.Model):
    name = models.CharField(max_length=36)
    price = models.PositiveIntegerField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    is_favourite = models.ManyToManyField(User, related_name='favourite', blank=True)
views.py

def my_favourite_list(request):
    user = request.user
    favourite_posts = user.is_favourite.all()
    context = {"favourite_posts":favourite_posts}
    return render(request, "core/my-fav-products.html", context)

@login_required
def Products(request):
    title = "All Products"

    products = Product.objects.annotate(
        favourited_by_user=Count(Case(
            When(
                is_favourite=request.user,
                then=1
            ),
            default=0,
            output_field=BooleanField(),
        )),
    ).order_by('-id')

    my_products = Product.objects.filter(user=request.user).order_by('-id')

    context = {"products":products, "my_products":my_products, "title":title}

    return render(request, 'core/products.html', context)

def change_favourite(request, pk):
    product = get_object_or_404(Product, pk=pk)
    if request.method == "POST":
        if Product.objects.filter(pk=pk, is_favourite=request.user).exists():
            product.is_favourite.remove(request.user)
        else:
            product.is_favourite.add(request.user)
    return redirect('product')
products.html

{% for product in products %}
<div class="col-md-4">
    <div class="card">
        <img class="card-img-top" style="height: 200px!important;" src="{{product.image.url}}" alt="Card image cap">
        <div class="card-body">
            <div class="card-title mb-3">
                <span>{{product.name}}</span>
                <span style="float: right;">
                    <form action="{% url 'add-favourite' product.id %}" method="post" style="display: inline-flex;">
                        {% csrf_token %}
                        <button type="submit">
                            {% if product.favourited_by_user %}
                                <i style="font-size: 22px!important;" class="fas fa-star m-r-10"></i>
                            {% else %}
                                <i style="font-size: 22px!important;" class="far fa-star m-r-10"></i>
                            {% endif %}
                        </button>
                    </form>
                    <a href="{% url 'edit-product' product.id %}"><i style="font-size: 22px!important;" class="zmdi zmdi-edit m-r-10"></i></a>
                    <a href="{% url 'delete-product' product.id %}"><i style="font-size: 22px!important;" class="zmdi zmdi-delete"></i></a>
                </span>
            </div>
            <p class="card-text">
                <span>Price: {{product.price}}</span>
                <span style="float: right;">Quantity: {{product.quantity}}</span>
            </p>
        </div>
    </div>
</div>
{% endfor %}
{%用于产品中的产品%}
{{product.name}
{%csrf_令牌%}
{%if product.favorited_被_用户%}
{%else%}
{%endif%}

价格:{{product.Price}} 数量:{{product.Quantity}

{%endfor%}
首先修复您的视图
产品
(理想情况下,函数名称应为
snake\u格式
,这意味着它应命名为
产品

现在为偏好逻辑编写另一个视图:

from django.shortcuts import redirect


def change_favourite(request, pk):
    product = get_object_or_404(Product, pk=pk)
    if request.method == "POST":
        if Product.objects.filter(pk=pk, is_favourite=request.user).exists():
            product.is_favourite.remove(request.user)
        else:
            product.is_favourite.add(request.user)
    return redirect('view-name-of-products-list')
现在添加此视图的url:

urlpatterns = [
    ...
    path('add-to-favourite/<int:pk>/', change_favourite, name='add-favourite'),
    ...
]
urlpatterns=[
...
路径('add-to-favorite/',change_-favorite,name='add-favorite'),
...
]
现在,在html中,只需将这些按钮放在表单中:

<form action="{% url 'add-favourite' product.pk %}" method="post">
    <button type="submit">{% if product.favourited_by_user %}Un-favourite Product{% else %}Favourite Product{% endif %}</button>
</form>

{%if product.favorited_被用户%}不喜欢的产品{%else%}喜欢的产品{%endif%}

根据需要设置按钮的样式。

这意味着这些元素有多个,如果您的数据库由于
get\u object\u或_404(产品)而具有多个元素,则会发生这种情况
不过滤任何东西,如
pk
等。如果你想要一个列表,请尝试使用。虽然我注意到你只是在下面的一行获得它。你甚至不使用变量
product
只需删除行
product=get\u object\u或_404(product)
。你能解释一下你的目标吗,并分享(产品的相关部分)您的模型。我正在尝试让用户单击图标将产品添加到收藏夹列表中,在我下面的教程中,我注意到只有当他拥有帖子详细信息时才有可能,因此他只能添加访问权限,在帖子详细信息页面上单击图标将帖子添加到收藏夹中,因此他可以执行以下操作“post=获取对象或404(post,id=id)"在将id传递到请求中时。但是我的情况不同,我将所有产品都放在一个页面上,并且我没有使用产品详细信息页面,因此我希望用户也能够单击产品页面上的图标。@coderboy:然后您应该创建一个单独的视图来处理单击,并重定向回列表页面。Th谢谢详细的答案,先生。看起来这个答案不起作用,先生。我已经做了必要的修改,但在单击星号后,它不会从普通星号变为实心星号,以表明它受到了欢迎。而且也没有任何错误。@coderboy注释中有轻微错误。修复了它,现在应该可以工作了。(删除
default=0,
)@coderboy您可以设置
related\u name='favorite'
,这意味着对于
User
的实例,您可以编写
User.favorite.all()。
<form action="{% url 'add-favourite' product.pk %}" method="post">
    <button type="submit">{% if product.favourited_by_user %}Un-favourite Product{% else %}Favourite Product{% endif %}</button>
</form>