Reputation: 199
I want to go to the product update method through the URL with the product ID by clicking on the product list but this error is coming. I don't understand what I did wrong here. The following codes are given.
Product list:
{% 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>  
<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"),
view:
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
I added save_product_form
here..
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:
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+)/$']
Upvotes: 0
Views: 58
Reputation: 5854
You don't add pk
to your context, so it's empty:
context = {'form': form} data['html_form'] = render_to_string(template_name, context, request=request)
Your context
must be contain a pk
in save_product_form
.
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)
...
or update your partial_product_update.html - use form.instance.pk
instead 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>
Upvotes: 1