NoReverseMatch 在 /products/update/6/ Reverse for 'product_update' with arguments '('',)' not found

NoReverseMatch at /products/update/6/ Reverse for 'product_update' with arguments '('',)' not found

我想通过 URL 进入产品更新方法,点击产品列表,输入产品 ID,但出现此错误。我不明白我在这里做错了什么。给出以下代码。

产品列表:

{% for product in products %}
<tr>
    <td>
        <img width="55px" height="55px" src="{{ product.photo.url }}" />
    </td>
    <td><input class="groupCheck" type="checkbox" value="{{product.id}}" id="{{product.id}}"/></td>
    <td>
        <a class="btn product-update" href="{% url 'accpack:product_update' pk=product.id %}">{{product.product_code}}</a>
    </td>
    <td>{{product}}</td>
    <td>
        <a class="far fa-plus-square fa-1x js-create-product_attribute" data-url="{% url 'accpack:products_attributes_create' pk=product.id %}"
                 data-toggle="modal" data-target="#modal-product_attribute"></a> &nbsp
        <a class="far fa-edit fa-1x js-create-product_attribute" data-url="{% url 'accpack:products_attributes_update' pk=product.id %}"
                 data-toggle="modal" data-target="#modal-product_attribute"></a>
    </td>
    <td>{{product.cost_price}}</td>
    <td>{{product.sale_price}}</td>
    <td>{{product.quantity_per_unit}}</td>
    <td>{{product.brand}}</td>
</tr>
{% endfor %}

url:

# Product url
url('products/$', views.product_index, name="products"),
url('products/create/$', views.product_create, name="product_create"),
url('products/update/(?P<pk>\d+)/$', views.product_update, name="product_update"),

查看:

def product_update(request, pk):
    product = get_object_or_404(Product, pk=pk)
    if request.method == 'POST':
        form = ProductForm(request.POST, instance=product)
    else:
        form = ProductForm(instance=product)
    return save_product_form(request, form, 'products/partial_product_update.html')

edit/update post
我在这里添加了 save_product_form..

def save_product_form(request, form, template_name):
        data = dict()
        if request.method == 'POST':
            if form.is_valid():
                form.instance.created_by = request.user
                form.instance.updated_by = request.user
                form.save()
                data['form_is_valid'] = True
                products = Product.objects.all().prefetch_related('categories').order_by('-id')
                data['html_list'] = render_to_string(request=request, template_name='products/partial_product_list.html', context={ 'products': products })
                #messages.success(request, "New Product Created")
            else:
                #for msg in form.error_messages:
                #    messages.error(request, f"{msg}: {form.error_messages[msg]}")
    
                data['form_is_valid'] = False
        context = {'form': form}
        data['html_form'] = render_to_string(template_name, context, request=request)

partial_product_update.html:

<form id="Form" method="post" action="{% url 'accpack:product_update' pk %}" class="col s12" enctype="multipart/form-data">
    {% csrf_token %}
    <br>
    {% crispy form form.helper %}
    <br>
</form>

回溯:

Traceback (most recent call last):
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\MEGA\djangoprojects\myprojects\accpack\views\products.py", line 52, in product_update
    return save_product_form(request, form, 'products/partial_product_update.html')
  File "D:\MEGA\djangoprojects\myprojects\accpack\views\products.py", line 36, in save_product_form
    data['html_form'] = render_to_string(template_name, context, request=request)
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\template\loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\template\base.py", line 170, in render
    return self._render(context)
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\template\defaulttags.py", line 446, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\urls\base.py", line 87, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "C:\Users\Dell\anaconda3\envs\webapp\lib\site-packages\django\urls\resolvers.py", line 685, in _reverse_with_prefix
    raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'product_update' with arguments '('',)' not found. 1 pattern(s) tried: ['products/update/(?P<pk>\d+)/$']

您没有将 pk 添加到您的上下文中,因此它是空的:

context = {'form': form}
data['html_form'] = render_to_string(template_name, context, request=request)

您的 context 必须在 save_product_form 中包含一个 pk

def save_product_form(request, form, template_name):
    ...
    context = {
        'form': form
        'pk': form.instance.pk
    }
    data['html_form'] = render_to_string(template_name, context, request=request)
    ...

或更新您的 partial_product_update.html - 使用 form.instance.pk 代替 pk:

{% load crispy_forms_tags %}
<form id="Form" method="post" action="{% url 'accpack:product_update' form.instance.pk %}" class="col s12" enctype="multipart/form-data">
    {% csrf_token %}
    <br>
    {% crispy form form.helper %}
    <br>
</form>