/ / Реверс для загальних видів url - django, django-urls

Зворотний для загальних посилань url - django, django-urls

Цей предмет є продовженням мислення в Росії ця тема. Я знову опинився у проблемі зворотного від загальноїпогляди Останній раз я думав, що це не має зворотного збігу, тому що я використовував багато для багатьох, тепер я не маю багатьох взаємин у зворотному порядку, але проблема все ще там. Оскільки в обох випадках у мене є загальний вигляд в URL-адресах, я запропонував проблему в загальних виглядах і немає функцій перегляду. Спочатку я використовував декоратор @permalink у моделях

...
@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})

URL-адреси

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: Зворотний для "сторінок" з аргументами "()" та аргументи ключових слів "{" page_name ": u" page1 "}" не знайдено.

Потім я спробував зворотний метод

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

І мати таку саму помилку

NoReverseMatch: реверс для "категорій" з аргументами "(2,)" і аргументи ключових слів "{}" не знайдено.

Виходячи з того, що permalink не явноВикористовуйте зворотний метод, я думаю, що проблема полягає в зворотному взаємодії та загальному перегляді в url. Чому це відбувається? Як використовувати загальні перегляди url у зворотному порядку?

Відповіді:

1 для відповіді № 1

Проблема в тому, що ви дали ім'я 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 }}.