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 %}
我正在使用 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 %}