Holen Sie sich Namen für die Vorlage in template-tag ( Django )
gibt es einen Weg, um den Namen der Vorlage ( geparsed ) in eine template-tag ?
Ich habe gelesen, gesucht und nichts gefunden, nur diesen früheren Beitrag
Immer der name des templates in django template
das hilft mir nicht viel, da die Antwort beruht auf "Einstellungen".DEBUG wahr ist, was in meinem Fall nicht sein kann.
Ich weiß wirklich nicht, wo Sie anfangen, auf diesen einen, so dass jeder Vorschlag ist willkommen 🙂
BEARBEITEN
Also im Grunde das, was ich will, ist zu schaffen eine steckbare tag gerendert, wenn es prüft, ob ein object-Tag, das wäre die Quelle für das object-tag
class Tag(models.Model):
template = models.CharFIeld(max_length=50)
name = models.CharField(max_length=100)
plugins = models.ForeignKey(PluginBase)
wenn es ein tag-Objekt, dann zeigt er alle plugin-Objekte, wenn er es nicht schafft ein tag-Objekt einmalig auf den Namen in der template-tag und den Namen der Vorlage, wenn Sie den Namen der Vorlage nicht möglich ist, dann denke ich, ich kann es nur einmalig pro name. Der ganze tag ist ein bisschen wie ein Platzhalter, für diejenigen, die vertraut mit django-cms
- Ich vermute, dass dies nicht möglich ist. Soweit ich weiß ist die template-Struktur wird analysiert, in einem Baum wie Modell, bevor die interpretation der tags erfolgt. Also ich würde davon ausgehen, die Informationen, die benötigt werden von Ihnen ist verloren, wenn das templatetag ausgeführt. (Dies ist nur eine wilde Vermutung, aber ich glaube, Sie sollten den plan, eine alternative 😉 )
- Was ist Ihre tatsächliche Benutzung Fall? Ich vermute, es gibt bessere Wege, das zu erreichen, was Sie wollen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie vielleicht, tun Sie dies mit einem Kontext-Prozessor, aber ich bin mir nicht sicher, ob diese Zugang zu den Namen der Vorlage.
Was ist ein wrapper für die rendering-Anrufe, die Sie tun. Sagen Sie, dass Sie derzeit tun, die folgenden:
Wenn Sie erstellen Sie Ihre eigenen wrapper für diese, fügen Sie der Vorlage einen Namen für das Wörterbuch vor dem eigentlichen Rendern statt:
Dann in Ihre Ansichten ändern es wie folgt (vorausgesetzt, speichern Sie die obige Funktion in
myutils.py
, und es verfügbar ist auf Ihrem Weg):Nun alle Ihre
render
Anrufe wird aktualisiert das Wörterbuch mit den Namen der Vorlage. In einer Vorlage, dann verwenden Sie einfach{{ template_name }}
um den Namen. Natürlich können Sie das update auch andere rendering-Funktion wierender_to_response
- und so auf ähnliche Weise.Auch, die
import myrender as render
könnte oder nicht, verwirren Sie später auf, weil es benannt ist wie die Django-Funktion... wenn ja, einfach importieren Sie es ohne die "as render
", und ersetzen Sie allerender
Anrufe mitmyrender
. Persönlich würde ich diese bevorzugen, da dies macht es zu einem drop-in-Ersatz für die vorhandenen rendering-Funktionen.Suche an der Quelle, während die
Template
- Objekt Zugang zu den template-Namen (über.name
) dieser Wert wird nicht an die Parser Objekt und daher nicht verfügbar, um die template-tags.Gibt es verschiedene Möglichkeiten, den Namen der Vorlage verfügbar, um die Vorlage selbst (indem es der Kontext), aber nicht innerhalb der template-tags.
Als Daniel Roseman erwähnt in den Kommentaren, wenn Sie können näher erläutern, was man tatsächlich erreichen möchte, kann es einen besseren Weg, das zu erreichen, was Sie wollen. Nichts für ungut, aber das klingt wie es kann eine XY-problem.
Aus akademischen Interesse, ich hatte einen schnellen fiddle, um zu sehen, wenn es möglich war. Soweit ich sehen kann, ist es möglich, aber nicht ohne die änderung oder monkey-patching die django-Quelle.
Hinweis: das folgende ist nicht eine empfohlene Lösung und lediglich Hinweise, was erforderlich sein kann, um tatsächlich diese Arbeit machen. Nicht verwendet werden für die Produktion von code.
Durch ändern
django.template.base.py
mit den folgenden änderungen, die wir hinzufügen, die.template_name
Attribut an den parser-Objekt verfügbar zu machen, um template-tags.compile_string
compile_string()
Dieses heraus zu testen, habe ich Folgendes definiert tag, das gibt einfach den Namen der Vorlage in caps:
und die folgende Vorlage:
Scheint dies zu funktionieren, wenn getestet
./manage.py shell
:Während dies scheint zu funktionieren, sollte ich noch einmal betonen, dass das manuell patchen des django Quelle nie eine gute Lösung und unterliegen alle Arten von Elend, die bei der Migration auf unterschiedliche Versionen.