Форум сайта python.su
Хочу разобраться с механизмом работы этого тэга. После прочтения документации осталось много неясностей. Сделал свой простенький проектик, для отработки. Подскажите как правильно вставлять этот тэг в шаблон вместе с аргументами типа {% 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()
class PlaceCategory(models.Model): category=models.CharField(max_length=50) class Place(models.Model): category=models.ForeignKey(PlaceCategory) name=models.CharField(max_length=50)
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))
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(r'^(?P<category_name>\w+)/(?P<place_name>\w+)/$', news_of_place, name='ccc_view'),
"""<a href="{% url places.views.news_of_place place.name %}">{{ place.name }}</a>"""
Офлайн
В итоге должно быть так у вас:
c = Context({'places': places, 'category_name': category_name})
...
<a href="{% url ccc_view category_name=category_name place_name=place.name %}">
Офлайн
То что два параметра надо, я понимаю.
То что могу вместо полного пути к функции представления ставить значение агрумента 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 (Авг. 10, 2012 22:49:14)
Офлайн
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))
Отредактировано buddha (Авг. 10, 2012 23:04:38)
Офлайн
Догадка: может это связано с Юникодом? Не знаю как тэг url с ним поступает, но r“\w+” не совпадет с u“Частные”.
Если попробовать:
url(r'^(?P<category_name>[^/]+)/(?P<place_name>[^/]+)/$', news_of_place, name='ccc_view'),
Офлайн
=) заработало
безумно рад) спасибо огромное, нервов было сожжено добротно.
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')
Отредактировано buddha (Авг. 11, 2012 00:57:00)
Офлайн