Thursday, July 2, 2015

Re: NoReverseMatch in Django (url ploblem)

> I'm a beginner of Django I want to set my url with database field_name
> instead of use primary key from Django tutorial. This is my code.
>
> *mysite*
> **dwru/urls.py**
> urlpatterns = [
> url(r'^$', include('product.urls', namespace="product")),
> ]

This regex is incorrect, and will only match a URL of '/', which is
probably not what you want (since you are making other URL's like
'/TestCA01' down below). You need to remove the $ from the regex to
pass along the entire URL string to the include. You probably need a
slash in there also to remove it as a prefix when it is passed along
to the include:

url(r'^/', include('product.urls', namespace="product")),


>
> *myapp*
> **product/urls.py**
> urlpatterns = [
> url(r'^$', views.index, name='index'),
> url(r'^(?P<name_catalog>[-_\w]+)/$', views.product_list_from_index,
> name='catalog'),
> ]


Assuming you fix the issue above, after a cursory glance this looks
fine. Just a note that \w includes the underscore, so you can remove
that as one of the potential matching characters.


>
> **product/views.py**
> def product_list_from_index(request, name_catalog):
> catalog = get_object_or_404(Catalog, name_catalog=name_catalog)
> context = {
> 'catalog': catalog
> }
> return render(request,'product/product_list.html', context)
>
>
> **product/models.py**
> class Catalog(models.Model):
> name_catalog = models.CharField(max_length=45)
> product = models.ManyToManyField(Product)
>
> **template/product/index.html**
> {% for catalog in catalog_list %}
> <h1><a href="{% url 'product:catalog' catalog.name_catalog %}">{{
> catalog.name_catalog }}</h1>
> {% endfor %}
>
> Then I add Catalog field with "TestCa01" then it shown an error
>
> NoReverseMatch at /
> Reverse for 'catalog' with arguments '(u'TestCa01',)' and keyword arguments
> '{}' not found. 1 pattern(s) tried: [u'$(?P<name_catalog>[-_\\w]+)/$']
>

It's odd that the regex is showing prefixed with a $ (I can't recall
seeing that before), that would indicate that it is looking for the
end of the line at the beginning of the regex statement, which means
the rest of the statement will never match. This may be an artifact
from the regex issue above.


> it kind of some problem with this line in template
>
> {% url 'product:catalog' catalog.name_catalog %}
>
> any Idea?
>

Unfortunately, it's hard to pinpoint in the error message what exactly
broke. Someone submitted a ticket a while back to make the error
message more concise and point people back to their URL confs. It was
closed because the list of URL regex's is now displayed.

https://code.djangoproject.com/ticket/14343


While I'm not deeply familiar with the code behind the URL resolver
functions, fixing the initial regex will need to be done regardless.
My wild guess would be that it properly fills in the value for
P<name_catalog>, but sine the include statement is incorrect (and will
ignore anything after the initial / in the requested URL), the string
doesn't match when the regex is checked.

-James

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CA%2Be%2BciVVL53juBEM1fz_uJrQkaY76iiyy02nxv1CRxUkiDodAg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment