/ / Reverse für generische Ansichten von URLs - Django, Django-URLs

Reverse für allgemeine URL-Ansichten - django, django-urls

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 № 1

Das 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 }}.