NoReverseMatch in Django (url ploblem)

98 vues
Accéder directement au premier message non lu

Jeff Gaoey

non lue,
2 juil. 2015, 06:03:4102/07/2015
à django...@googlegroups.com

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")),
]

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

**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 kind of some problem with this line in template

{% url 'product:catalog' catalog.name_catalog %}

any Idea?

James Schneider

non lue,
2 juil. 2015, 20:05:1302/07/2015
à django...@googlegroups.com
> 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

James Schneider

non lue,
2 juil. 2015, 20:38:5402/07/2015
à django...@googlegroups.com


> > 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")),
>

I was thinking about this and you may not need the /, if it doesn't work, try without it. I'm not in front of a computer to verify.

-James

Jeff Gaoey

non lue,
5 juil. 2015, 07:08:5105/07/2015
à django...@googlegroups.com
James - Thank You Very Much

that true it doesn't need /. everything work fine as I want :D.

เมื่อ วันศุกร์ที่ 3 กรกฎาคม ค.ศ. 2015 7 นาฬิกา 38 นาที 54 วินาที UTC+7, James Schneider เขียนว่า:
Répondre à tous
Répondre à l'auteur
Transférer
0 nouveau message