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 № 1Problem 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 }}
.