Dieses Thema ist eine Fortsetzung des Denkens dieses Thema. Ich habe mich im generischen Problem des Rückwärtsgangs zurückgezogenAnsichten. Letztes Mal dachte ich, dass es kein umgekehrter Treffer ist, weil ich viele bis viele verwendet habe, jetzt habe ich nicht viele Beziehungen, aber das Problem ist immer noch drin. Da ich in beiden Fällen eine generische Ansicht in URLs habe, schlug ich vor, dass das Problem in generischen Ansichten und ohne Ansichtsfunktion besteht. Zuerst habe ich den @permalink Dekorator in den Modellen verwendet
...
@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")
Und bekam einen Fehler:
NoReverseMatch: Umkehren für "Seiten" mit Argumenten "()" und Schlüsselwortargumenten "{" Seitenname ": u" Seite1 "}" nicht gefunden.
Dann habe ich die umgekehrte Methode ausprobiert
def get_absolute_url(self):
return reverse("categories", args = [self.id, ])
Und habe den gleichen Fehler
NoReverseMatch: Umkehren für "Kategorien" mit Argumenten "(2,)" und Schlüsselwortargumenten "{}" nicht gefunden.
Basierend auf der Tatsache, dass Permalink nicht explizitVerwenden Sie die umgekehrte Methode, ich denke, das Problem liegt in der Interaktion umgekehrte und generische Ansicht in URL. Warum passiert es? Wie verwende ich reverse in generischen Ansichten?
Antworten:
1 für die Antwort № 1Das Problem ist, Sie haben den Namen angegeben categories
zu einer allgemeinen Ansicht, direct_to_templateund Sie übergeben ein Argument an diese Ansicht - aber direct_to_template nimmt dieses Argument nicht an, nur ein Wörterbuch, das zusätzlichen Kontext enthält.
Wenn Sie zusätzliche Argumente an eine generische Ansicht übergeben möchten, können Sie dies tun. Diese werden jedoch nur an die Vorlage weitergeleitet. Sie können die Ansicht erweitern indem Sie Ihre eigene Funktion schreiben, die den Parameter in ein Wörterbuch einfügt und dann die generische Ansicht aufruft. Etwas wie das:
# 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)
Und dann in deinem urls.py
, ersetze das direct_to_template
mit my_view
. Schon seit my_view
dauert ein id
Streit, reverse
stimmt damit überein, und das Argument wird an die generische Ansicht und an die Vorlage übergeben.
Vermutlich irgendwo in Ihrer Vorlage befindet sich eine Zeile wie {{ id }}
.