Django 如何解决 NoReverseMatch 错误?

Django How can I solve NoReverseMatch error?

我正在使用 Django 制作网站。

我对 url 有疑问。

我尝试访问该网站,但出现错误。

错误是 NoReverseMatch。

反向 'add',没有找到任何参数。尝试了 1 种模式:['purchase/order/(?P<CAT_ID>[^/]+)/$']

我该如何解决这个问题?

# urls.py
{% for value in object_list %}

    <tr>
      <form action="{% url 'purchase_order:add' value.CAT_ID %}" method="get">
         <td scope="row">{{ value.CAT_ID }}</td>
         <td scope="row">{{ value.INFOR }}</td>
         <td scope="row">
            <input type="submit" value="CREATE" class="btn btn-outline-secondary btn-sm">
         </td>
       </form>
    </tr>

{% endfor %}
# urls.py

app_name = 'purchase_order'

urlpatterns = [

    # CREATE URL
    path('order/<str:CAT_ID>/', views.Order_add_View.as_view(), name='add'),
    
    ]
# views.py

class Order_add_View(LoginRequiredMixin, CreateView):
    model = Purchase_Request
    # template_name = 'purchase_order/add.html'
    fields = ['CAT_ID', INFOR]

    def get(self, request, *args, **kwargs):

        CAT_ID = self.kwargs['CAT_ID']

        return render(request, 'purchase_order/add.html', {'CAT_ID':CAT_ID})

    def form_valid(self, form):
        form.instance.owner = self.request.user
        return super().form_valid(form)

您需要将 CAT_ID 作为关键字参数添加到模板标签中:

{% for value in object_list %}

    <tr>
      <form action="{% url 'purchase_order:add' CAT_ID=value.CAT_ID %}" method="get">
         <td scope="row">{{ value.CAT_ID }}</td>
         <td scope="row">{{ value.INFOR }}</td>
         <td scope="row">
            <input type="submit" value="CREATE" class="btn btn-outline-secondary btn-sm">
         </td>
       </form>
    </tr>

{% endfor %}

如果我们查看您的表单操作 url,django 正在尝试解析但无法解析

{% url 'purchase_order:add' value.CAT_ID %}

错误显示 Reverse for 'add' with no arguments not found.. 但你已经给了它一个参数! value.CAT_ID 那有什么好处呢?

这意味着在模板的上下文中 value.CAT_ID 中不存在任何值。 url 还不如只读

{% url 'purchase_order:add' %}

因为那是 django 在运行时看到的。

您已经用

迭代了 object_list
{% for value in object_list %}

因此,object_list 不是视图上下文,而只是序列化的 Purchase_Request 对象的列表,您的基于 class 的视图已为您添加到模板上下文中(如果正确设置)。您的 Purchase_Request 模型没有 CAT_ID 字段,因此 value.CAT_ID returns 没有。

不过您确实将 CAT_ID 添加到模板的上下文中

return render(request, 'purchase_order/add.html', {'CAT_ID':CAT_ID})

它只是模板上下文中的 CAT_ID

{% for value in object_list %}

    <tr>
      <form action="{% url 'purchase_order:add' CAT_ID %}" method="get">
         <td scope="row">{{ CAT_ID }}</td>
         <td scope="row">{{ value.INFOR }}</td>
         <td scope="row">
            <input type="submit" value="CREATE" class="btn btn-outline-secondary btn-sm">
         </td>
       </form>
    </tr>

{% endfor %}