Реверс не найден: отправка контекста запроса из шаблонов - PullRequest
3 голосов
/ 13 апреля 2009

N.B Этот вопрос был значительно отредактирован до того, как был дан первый ответ.

Привет

Я довольно новичок в django, поэтому извиняюсь, если мне не хватает чего-то очевидного.

У меня есть файл urls.py, который выглядит следующим образом:

urlpatterns = patterns(
    '',
    (r'^$', 'faros.lantern.views.home_page'),
    (r'^login/$', 'django.contrib.auth.views.login'),
    (r'^logout/$', 'django.contrib.auth.views.logout'),
    (r'^about/$', 'faros.lantern.views.about_page_index', {}, 'about_page_index'),
    (r'^about/(?P<page_id>([a-z0-9]+/)?)$', 'faros.lantern.views.about_page', {}, 'about_page'),
)

Просмотры, которые выглядят так:

def about_page_index(request):
    try:
        return render_to_response('lantern/about/index.html', context_instance=RequestContext(request))
    except TemplateDoesNotExist:
        raise Http404

def about_page(request, page_id):
    page_id = page_id.strip('/ ')

    try:
        return render_to_response('lantern/about/' + page_id + '.html', context_instance=RequestContext(request))
    except TemplateDoesNotExist:
        raise Http404

И шаблон, который включает это:

<a href="{% url lantern.views.about_page_index %}">Contact</a>
<a href="{% url lantern.views.about_page page_id="contact" %}">Contact</a>

Я получаю это сообщение об ошибке:

Caught an exception while rendering: Reverse for '<function about_page at 0x015EE730>' with arguments '()' and keyword arguments '{'page_id': u'contact'}' not found. The first reverse works fine (about_page_index), generating the correct URL without error messages.

Я думаю, это потому, что используется аргумент запроса для представления about_page (request), поэтому мне нужно передать его при создании URL-адреса в моем шаблоне. Проблема в том, что я не знаю, как туда добраться, и поиск вокруг меня никуда не приведет. Есть идеи?

Спасибо

Дом

p.s. Кроме того, этот метод обработки статических страниц типа «примерно» в приложении выглядит ужасно или разумно? По сути, я беру URL-адреса и предполагаю, что путь к шаблону - это то, что следует после бита about/. Это означает, что я могу сделать статические страницы похожими на часть приложения, так что пользователь может перейти в раздел about и затем вернуться туда, откуда они пришли. Комментарии / Отзывы о том, ценится ли это джангоизм или глупо!

1 Ответ

9 голосов
/ 13 апреля 2009

Если я правильно угадаю из сигнатуры вашей функции просмотра (def about_page(request, page_id = None):), вероятно, у вас есть другая конфигурация URL, которая указывает на то же представление, но не принимает параметр page_id. Если это так, обратная функция django увидит только одну из них, и, вероятно, она увидит ту, у которой нет названного шаблона регулярного выражения page_id. Это довольно распространенная ошибка с реверсом! : -)

Чтобы обойти это, присвойте имя каждому шаблону URL (см. Синтаксис переменной urlpatterns ). В случае вашего примера вы должны сделать:

(r'^about/(?P<page_id>([a-z]+/)?)$', 'faros.lantern.views.about_page', 
 {}, 'about_with_page_id')

и затем в шаблоне:

<a href="{% url about_with_page_id page_id="contact" %}">Contact</a>

Редактировать

Спасибо за публикацию обновленного urls.py. В теге шаблона url использование неквалифицированного имени шаблона должно помочь (заметьте, что я удаляю часть lantern.views:

<a href="{% url about_page_index %}">Contact</a>
<a href="{% url about_page page_id="contact" %}">Contact</a>

Edit2

Извините, я не пел к этому раньше. Ваш паттерн выражен так, что django не может повернуть вспять, и это является причиной несоответствия. Вместо:

r'^about/(?P<page_id>([a-z]+/)?)$'

использование:

r'^about/(?P<page_id>[a-z0-9]+)/$'

Я создал в своей системе фиктивный проект, который соответствовал вашему, воспроизвел ошибку и вставил это исправление в успех. Если это не решит твою проблему, я съем мою шляпу! : -)

...