5

Zusammenfassung verweisen:Wie statische Dateien in einer Lenker-django Vorlage

Wie soll ich Referenz statische Dateien in einem Lenker-Teil in einer django Vorlage? Ich kann Lenker verwenden, wenn ich verbatim Tags benutze, aber dann kann ich Djangos static Tag nicht verwenden.

Einzelheiten

Während eine App Django Umwandlung, stieß ich auf einen Teil, das handelbars.js für das Rendering Ajax-call-Ergebnisse verwendet. Via, unter anderem, "Handlebars.js in Django templates" Ich habe herausgefunden, über die {% verbatim %} Tag.

Ein einfaches Stück Lenker funktioniert gut mit diesem. Aber ich habe auch einen Teil, in dem Bild wird dynamisch auf der Basis des Ergebnis dargestellt, die etwa wie folgt aussieht:

<img src="path/{{ result }}.png"> 

Jetzt, während dies funktioniert gut, wenn ich den Pfad manuell einstellen, ich glaube an Django ist es gute Praxis, Referenz Ihre statischen Dateien wie folgt:

<img src="{% static 'path/file.png' %}"> 

nur immer eine static_url konstante wird nicht empfohlen, see for instance this blog

also, wenn jemand einen echten zwingenden Grund hat, es zu beheben sonst, ich glaube, es am besten ist, die verwenden {% static %} Methode.

Die naive Lösung wäre, die 2 Techniken zu kombinieren und die Vorlage buchstäblich mit Verbatim/Endverbatim zu besprühen. Abgesehen davon, dass dies hässlich, unleserlich und von Anfang an eine schlechte Idee ist, funktioniert es auch nicht.

{% verbatim %} 
    <!-- handlebars --> 
    {% endverbatim %} 
    <img src="{% static 'path{% verbatim %}{{ result }}{% endverbatim %}' %}"> 
    {% verbatim %} 
    <!-- handlebars --> 
{% endverbatim %} 

Dieser endet in Tränen, als das Ergebnis ist

TemplateSyntaxError at/
konnte der Rest nicht analysieren: '' path {% 'aus '' path {%'

Es könnte möglich sein, die korrekte statische URL auf der Backend-Seite zu generieren und diese zu rendern. Das Back-End sollte jedoch nicht wissen, welches Bild in der Vorlage angezeigt werden soll.

Die einzige Lösung könnte sein, einen zusätzlichen Aufruf des Backends mit der 'relativen' Zeichenfolge (z. B. path/result.png) an das Backend zu machen und nach der korrekten statischen Verbindung zu fragen? Das ist nicht so schwer, erfordert aber einen zusätzlichen Anruf, was nicht der Fall sein sollte.

Wie kann ich diese statischen Dateien korrekt referenzieren?

+0

Die Argumente gegen die Verwendung von 'STATIC_URL' in dem Blogpost, auf den Sie verweisen, scheinen für Ihren Anwendungsfall nicht relevant zu sein. In der Tat würde ich das Gegenteil argumentieren, weil Sie explizit nur das statische URL-Präfix wollen. Der Rest der URL (der Dateinamensabschnitt) wird auf der Clientseite von Ihrer Lenkervorlage generiert. Beachten Sie auch, dass es ein Vorlage-Tag ['get_static_prefix'] (https://docs.djangoproject.com/de/1.9/ref/templates/builtins/#get-static-prefix) gibt, das' STATIC_URL' für Sie umschließt. – solarissmoke

+0

Ich bin mir nicht sicher, ob ich dem zustimme. Ich möchte einen variablen Teil eines Bildes (der Name Teil), der von JSON kommt, und wird von Lenkstangen geparst. Aber dieses Bild wird von django als statische Datei geliefert, also möchte ich, dass django entscheidet, was dort eigentlich passieren würde. Es gibt keinen Grund, dass Caching-Beispiel in der Unterseite des Links in meiner Situation nicht gültig ist -> Wenn ich sie zwischenspeichern möchte dann würde Lenker nicht darüber wissen. Am Ende würden die Lenker nur über den "relativen" Teil der statischen Datei Bescheid wissen, und soweit ich sehen kann, sind alle Argumente in diesem Blog relevant? – Nanne

+0

Dann ist es wichtig, richtige statische URL-Generierung für den JSON zu verwenden? Ich sehe nicht, wie es für das Lenker-Template hilft, wenn der tatsächliche Dateipfad (was Caching/anderes Speicher-Backend/etc ändern würde) eine generierte Client-Seite ist. – solarissmoke

Antwort

2

Sie möchten nicht die Grenze zwischen Lenker-Tags und Django-Tags definieren.Vielleicht ist die sauberste Lösung ist explizit Lenker Tags als so zu erklären:

{{ "handlebars_variable"|handlebars }} 

wo die filterhandlebars definiert als so (source):

from django import template 
register = template.Library() 

@register.filter 
def handlebars(value): 
    # str.format would require ugly escaping, so we use '%' 
    return '{{%s}}' % value 

Aber das ist nicht genug: Sie wollen einen Lenker passieren Tag an static, und selbst mit dem Filter können Sie das nicht direkt tun. Aber vielleicht könnten Sie versuchen with mit:

{% with "handlebars_variable"|handlebars as handlebars_tag %} 
    <img src="{% static handlebars_tag %}"> 
{% endwith %} 

Aber auch das ist nicht genug. Sie möchten path/ voranstellen. Es gibt mehrere Optionen für Sie:

  • Sie könnten nutzen die add Filter basierend auf this answer und verschachtelt with Aussagen (igitt).
  • Sie könnten ein Template-Tag namens setvar wie getan here (wenn Sie möchten) definieren.
  • Sie könnten eine Ad-hoc-Template-Tag wie folgt definieren (vielleicht unelegant):

    @register.filter 
    def static_result_path(value): 
        return 'result/{{%s}}' % value 
    

    und dann die zu Template-Code ändern: (! Einfachsten)

    <img src="{% static "handlebars_variable"|static_result_path %}"> 
    
  • Verwendung get_static_prefix:

    <img src="{% get_static_prefix %}result/{{ "handlebars_variable"|handlebars }}" /> 
    
  • (Und es gibt immer.003.210.)

+0

Es sieht wirklich gut aus, aber ich konnte es gestern nicht zur Arbeit bekommen. Dies war hauptsächlich wegen der kurzen Debugging-Zeit, also denke ich, dass das ein guter sein könnte! – Nanne

+0

Wie sehen die Fehler aus? –

+0

Es waren meistens verschiedene Setup-Probleme oder Tippfehler, zumindest die ersten, mit denen ich zu tun hatte :). Ich muss zugeben, dass es vielleicht ein paar Nianticlabs-Spiele zwischen mir und diesem Problem gegeben hat, aber Sie als richtig markiert haben: D – Nanne

1

Obwohl django Vorlagen, keine Art von Escape-Zeichen unterstützen tun sie das templatetag-Tag unterstützen, die Sie den speziellen Text in diesem Fall einzubetten.

Vorausgesetzt, dass Sie nicht zu viele Ersetzungen Lenker haben, können Sie einfach so etwas tun, je nach Bedarf:

<img src="{% get_static_prefix %}path/{% templatetag openvariable %} result {% templatetag closevariable %}.png" /> 

Wenn Sie jedoch viele Ersetzungen zu tun haben, mit einem benutzerdefinierten Filter per Yarthathrocks Antwort ist prägnanter und daher auf lange Sicht wahrscheinlich einfacher zu pflegen.