Този въпрос е продължение на мисленето в тази тема, Отпаднах в проблем с обратното по родовогледки. Последният път мислех, че няма обратна връзка, защото използвах много от мнозина, сега нямам много взаимоотношения, но все още има проблем. Тъй като имам генеричен изглед в 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 }}
.