Найти - Пользователи
Полная версия: проблема с {% url %} NoReverseMatch
Начало » Django » проблема с {% url %} NoReverseMatch
1
buddha
Хочу разобраться с механизмом работы этого тэга. После прочтения документации осталось много неясностей. Сделал свой простенький проектик, для отработки. Подскажите как правильно вставлять этот тэг в шаблон вместе с аргументами типа {% url path.to.views_func arg1 arg2 %}.

news/models.py:
from places.models import Place
class News(models.Model):
    place=models.ForeignKey(Place)
    title=models.CharField(max_length=50)
    short_text=models.TextField()
    full_text=models.TextField()

places/models.py:
class PlaceCategory(models.Model):
    category=models.CharField(max_length=50)
class Place(models.Model):
    category=models.ForeignKey(PlaceCategory)
    name=models.CharField(max_length=50)

places/views.py:
from places.models import Place, PlaceCategory
from news.models import News
from django.http import HttpResponse
from django.template import Context, Template
def all_categories_view(request):
    t=Template('''
    {% for category in categories %}
        <a href="{% url places.views.place_of_category category.category %}">{{ category.category }}</a><hr>
    {% endfor %}
    ''')
    categories=PlaceCategory.objects.all()
    c=Context({'categories':categories})
    return HttpResponse(t.render(c))
def place_of_category(request, category_name):
    t=Template('''
    {% for place in places %}
        <a href="{% url places.views.news_of_place place.name %}">{{ place.name }}</a>
    {% endfor %}
    ''')
    places=Place.objects.filter(category__category=category_name)
    c=Context({'places':places})
    return HttpResponse(t.render(c))
def news_of_place(request, place_name):
    t=Template('''
    {% for new in news %}
        <h3>{{ new.title }}</h3>
    {% endfor %}
    ''')
    news=News.objects.filter(place__name=place_name)
    c=Context({'news':news})
    return HttpResponse(t.render(c))

urls.py:
urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', all_categories_view, name='zzz_view'),
    url(r'^(?P<category_name>\w+)/$', place_of_category, name='xxx_view'),
    url(r'^(?P<category_name>\w+)/(?P<place_name>\w+)/$', news_of_place, name='ccc_view'),
)

Главная страница показывает мне категории мест корректно. На каждую из этих категорий назначается ссылка тэгом {% url %}. Нажимаю на ссылку , он выдает ошибку:
Request Method: GET
Request URL: http://127.0.0.1:8000/%D0%91%D1%8E%D0%B4%D0%B6%D0%B5%D1%82%D0%BD%D1%8B%D0%B5/
Django Version: 1.4
Exception Type: NoReverseMatch
Exception Value: Reverse for ‘places.views.news_of_place’ with arguments ‘(’', u'\u0411\u043e\u043b\u044c\u043d\u0438\u0446\u0430 1')' and keyword arguments ‘{}’ not found.


без тэга {% url %} ссылка переходит на след страничку и отображает места корректно.
Кода много, надеюсь проблема понятна.
reclosedev
 url(r'^(?P<category_name>\w+)/(?P<place_name>\w+)/$', news_of_place, name='ccc_view'),
Требует двух параметров - category_name и place_name
 """<a href="{% url places.views.news_of_place place.name %}">{{ place.name }}</a>"""
Тут только один place_name. Поэтому и не находит. Т.е. нужно добавить категорию.

Кстати, можно вместо places.views.news_of_place использовать имена (ccc_view в данном случае).
adw0rd

В итоге должно быть так у вас:

c = Context({'places': places, 'category_name': category_name})

...

<a href="{% url ccc_view category_name=category_name place_name=place.name %}">
buddha
То что два параметра надо, я понимаю.
То что могу вместо полного пути к функции представления ставить значение агрумента name из url('',,name='some_name') делал, знаю.

Мне не нравится во-первых, то, что HTML-разметке(шаблоне) первого представления(по порядку из urlpatterns ) - all_categories_view надо вставлять ссылку на второе представлени - place_of_category и т.д. по иерархии, т.е. в шаблоне 4го представления вставлять ссылку на пятое представление.

Во-вторых, получается , что каждый раз когда я использую тэг {% url %} мне придется туда впёхивать все все параметры, которые требует ссылка. А это значит, что для каждого представления мне постоянно придется дублировать одни и те же запросы к модели, и так по нарастающей.

а что если ссылка будет вида:
url('^(?P<arg1>\w+)/(?P<arg2>\w+)/(?P<arg3>\w+)/(?P<arg4>\w+)/(?P<arg5>\w+)/$', some_view, name='view_name_from_pattern')

то мне придется в теге писать так????????
{% url view_name_from_pattern arg1 arg2 arg3 arg4 arg5 %}

Наверно я чего то не втыкаю

to adword, прочитал….
buddha
adw0rd
В итоге должно быть так у вас:
c = Context({'places': places, ‘category_name’: category_name})

<a href=“{% url ccc_view category_name=category_name place_name=place.name %}”>

сделал так:
def place_of_category(request, category_name):
    t=Template('''
    {% for place in places %}
        <a href="{% url ccc_view category_name=category_name place_name=place.name %}">{{ place.name }}</a>
    {% endfor %}
    ''')
    places=Place.objects.filter(category__category=category_name)
    c=Context({'places':places, 'category_name':category_name})
    return HttpResponse(t.render(c))

при переходе на http://127.0.0.1:8000/%D0%A7%D0%B0%D1%81%D1%82%D0%BD%D1%8B%D0%B5/

ошибка:
Request Method: GET
Request URL: http://127.0.0.1:8000/%D0%A7%D0%B0%D1%81%D1%82%D0%BD%D1%8B%D0%B5/
Django Version: 1.4
Exception Type: NoReverseMatch
Exception Value: Reverse for ‘ccc_view’ with arguments ‘()’ and keyword arguments ‘{’place_name': u'\u041f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0433\u0430\u0437\u0438\u043d', ‘category_name’: u'\u0427\u0430\u0441\u0442\u043d\u044b\u0435'}' not found.



%D0%A7%D0%B0%D1%81%D1%82%D0%BD%D1%8B%D0%B5=Частные
reclosedev
Догадка: может это связано с Юникодом? Не знаю как тэг url с ним поступает, но r“\w+” не совпадет с u“Частные”.

Если попробовать:
url(r'^(?P<category_name>[^/]+)/(?P<place_name>[^/]+)/$', news_of_place, name='ccc_view'),

(сейчас нет возможности проверить)
buddha
=) заработало
безумно рад) спасибо огромное, нервов было сожжено добротно.

 url(r'^$', all_categories_view, name='zzz_view'),
 url(r'^(?P<category_name>[^/]+)/$', place_of_category, name='xxx_view'),
 url(r'^(?P<category_name>[^/]+)/(?P<place_name>[^/]+)/$', news_of_place, name='ccc_view')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB