/ / Reverse dla ogólnych widoków URL - django, django-urls

Odwróć dla ogólnych widoków URL - django, django-urls

Ten temat jest kontynuacją myślenia ten temat. Wróciłem do problemu generalnego odwrotuwidoki. Ostatnim razem myślałem, że to nie jest odwrotny mecz, ponieważ użyłem wielu dla wielu, teraz nie mam zbyt wielu relacji na odwrót, ale problem wciąż istnieje. Ponieważ w obu przypadkach mam ogólny widok w adresach URL, zasugerowałem, że problem dotyczy widoków ogólnych i funkcji widoku. Najpierw użyłem dekoratora @permalink w modelach

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

adresy 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")

I wystąpił błąd:

NoReverseMatch: Reverse dla "stron" z argumentami "()" i argumentów słów kluczowych "{" page_name ": u" page1 "}" nie znaleziono.

Potem spróbowałem metody odwrotnej

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

I mam ten sam błąd

NoReverseMatch: Odwróć dla "kategorii" z argumentami "(2)" i nie znaleziono argumentów słów kluczowych "{}".

W oparciu o fakt, że permalink nie jawnieużyj metody odwrotnej, myślę, że problem polega na odwróceniu interakcji i ogólnym widoku w adresie URL. Dlaczego tak się dzieje? Jak korzystać z odwrotnego widoku ogólnego adresu URL?

Odpowiedzi:

1 dla odpowiedzi № 1

Problem polega na tym, że podałeś to imię categories do ogólnego widoku, direct_to_templatei przekazujesz argument do tego widoku - ale direct_to_template nie przyjmuje tego argumentu, a jedynie słownik zawierający dodatkowy kontekst.

Jeśli chcesz przekazać dodatkowe argumenty do ogólnego widoku, możesz - ale zostaną one przekazane do szablonu. Możesz rozszerz widok pisząc własną funkcję, która dodaje parametr do słownika, a następnie wywołuje ogólny widok. Coś takiego:

# 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)

A potem w twoim urls.py, Zastąp direct_to_template z my_view. Od my_view bierze id argument, reverse odpowiednio się do niego dopasuje, a argument zostanie przekazany do widoku ogólnego i do szablonu.

Prawdopodobnie gdzieś w twoim szablonie jest linia taka, jak {{ id }}.