Реверс для общих просмотров URL - PullRequest
0 голосов
/ 12 июня 2011

Эта тема является продолжением мышления в этой теме . Я вернулся к проблеме реверса в общих взглядах. В прошлый раз я думал, что это не обратное совпадение, потому что я использовал много ко многим, теперь у меня не так много отношений *** к обратному, но проблема все еще существует. Так как в обоих случаях у меня есть общее представление в URL, я предположил, что проблема заключается в общих представлениях и отсутствии функции представления. Сначала я использовал @permalink decorator в моделях

...
@permalink
def get_absolute_url(self):
    return ('categories', str(self.id))
...
@permalink
def get_absolute_url(self):
    return ('pages', (), {'page_name': self.human_readable_url})

URLs

url(r'^(?P<page_name>&\w*)?/?$', direct_to_template,
    {'template': 'basic.djhtml'},
    name = "pages"),
url(r'cat/\d+/$',
    direct_to_template,
    {'template': 'basic.djhtml'},
    name = "categories")

И получил ошибку:

NoReverseMatch: не найдено обратное значение для "страниц" с аргументами "()" и аргументами ключевых слов "{" имя_страницы ": u'page1 '}'.

Тогда я попробовал обратный метод

def get_absolute_url(self):
    return reverse('categories', args = [self.id, ])

И имеют ту же ошибку

NoReverseMatch: обратное для «категорий» с аргументами (2,) и ключевыми словами «{}» не найдено.

Основываясь на том факте, что постоянная ссылка явно не использует обратный метод, я думаю, что проблема заключается в обратном взаимодействии и общем представлении в URL. Почему это происходит? Как использовать реверс в общих представлениях URL?

1 Ответ

1 голос
/ 12 июня 2011

Проблема в том, что вы дали имя categories для общего вида, direct_to_template , и вы передаете аргумент этому представлению - но direct_to_template не принимает этот аргумент, только словарь, содержащий дополнительный контекст.

Если вы хотите передать дополнительные аргументы в общее представление, вы можете - но они будут только переданы в шаблон. Вы можете расширить представление , написав собственную функцию, которая добавляет параметр в словарь, а затем вызывает универсальное представление. Примерно так:

# views.py
from django.views.generic.simple import direct_to_template

def my_view(id):
    more_data = {'id': id}
    return direct_to_template(template = 'basic.djhtml', more_data)

А затем в вашем urls.py замените direct_to_template на my_view. Поскольку my_view принимает аргумент id, reverse будет правильно соответствовать ему, и аргумент будет передан в общее представление и через шаблон.

Предположительно где-то в вашем шаблоне есть строка, например, {{ id }}.

...