【问题标题】:NoReverseMatch Django error when trying to view cart - using Python 3.6尝试查看购物车时出现 NoReverseMatch Django 错误 - 使用 Python 3.6
【发布时间】:2018-07-26 18:13:53
【问题描述】:

我收到以下错误,我无法找出原因。

NoReverseMatch at /cart/
Reverse for 'add_to_cart' with arguments '('',)' not found. 1 pattern(s)  tried: ['cart\\/add\\/(?P<product_id>[^/]+)$']

在对模板进行一些更改之前,我没有遇到任何问题。我还更改了产品的 pk 值,但我猜这不会影响任何事情?我还使用了clearsessions 以防万一这可能是问题所在。我认为 Django 是在说它找不到与我提供的 url 匹配的内容,但对我来说一切似乎都是正确的。我对我的代码进行了一些更改,并尝试将其恢复到以前的状态,但我仍然收到相同的错误消息。我会展示我的代码,如果你能告诉我我可能在哪里犯了错误,那就太棒了。

这是我的 product_detail.html 模板

{% extends "buylist/Header.html" %}

{% block content %}
  <p>{{product.name}}</p>
  <p>{{product.price}}</p>
    <form action="{% url 'add_to_cart' product.id %}" method="post">
      {% csrf_token %}
      <input type="number" name="quantity" min="1" max="{{product.quantity}}">
      <button type="submit">add</button>
    </form>

{% endblock %}

我使用表单将 url 与产品 url 链接并将其添加到我的购物车 这是我关联的 urls.py 和 Views.py

urls.py

    path('cart/', views.get_cart, name='cart'),
path('cart/add/<product_id>', views.add_to_cart, name='add_to_cart'),
path('product/<product_id>', views.product_detail, name='product_detail'),

views.py

    def product_detail(request, product_id):
    product = get_object_or_404(Product, id=product_id)
    return render(request, 'buylist/product_detail.html', {'product':product})

def add_to_cart(request, product_id):
    quantity = request.POST.get('quantity')
    product = get_object_or_404(Product,id=product_id)
    cart = Cart(request)
    cart.add(product, product.price, quantity)
    return redirect('cart')


def get_cart(request):
    cart = Cart(request)
    return render(request, 'buylist/cart.html', {'cart':cart})

这是我购物车的模板

cart.html

{% extends 'buylist/Header.html' %}

    {% block content %}

    <h1>Your Cart</h1>
        {% for a in cart %}
            <form action="{% url 'add_to_cart' a.product.id %}" method="post">
                {% csrf_token %}

            <h4><a href= '{{a.product.get_absolute_url}}'>{{a.product.name}}</a><small>
              <input type="number" name="quantity" min="1" max="{{product.quantity}}" value="{{a.quantity}}">

            <br><button type="submit">Update</button></small></h4>
            <p>Price :

            {{a.price}}</p>
            </form>
        {% endfor %}

        <b>Total items: {{cart|length}}</b><br>
        <b>Total Price: {{cart|length}}</b><br>

    {% endblock %} 

如果你能帮助我,那就太棒了!

【问题讨论】:

  • 尝试在你的模板中打印路由参数——product.ida.product.id,看看这些变量是否真的包含你所期望的。注意 Django 模板语言不会警告你变量或字典键不存在。

标签: django python-3.x session django-templates


【解决方案1】:

确保在使用 url 模板标签时存在 product.ida.product.id 的值。

url 模板标签使用reverse 函数和其他参数来创建url。 (下面代码sn-p供参考)

    # Try to look up the URL. If it fails, raise NoReverseMatch unless the
    # {% url ... as var %} construct is used, in which case return nothing.
    url = ''
    try:
        url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
    except NoReverseMatch:
        if self.asvar is None:
            raise

如报错所示

未找到带有参数“('',)' 的“add_to_cart”的反向操作....

参数元组的第一个参数为空字符串,它与add_to_cart 提供的模式不匹配。

【讨论】:

  • 在进行故障排除后,我发现这些值不存在,因为我在未清除 cookie 的情况下对数据库进行了更改,因此它试图为不存在的 id 找到相反的值。我清除了计算机上的 cookie 并修复了它。也许避免这种情况发生的最好方法是添加一个简单的 if 语句检查该项目是否在数据库中,如果不是,则将其从购物车中删除?再次感谢!
猜你喜欢
  • 2015-11-01
  • 2017-09-04
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多