web-dev-qa-db-fra.com

Quelle est la différence entre {% load staticfiles%} et {% load static%}

La partie la plus importante de la question est dans le sujet.

Je me demande quelle étiquette est la meilleure pour quel cas. De plus ... j'ai trouvé du code, qui utilise aussi settings.STATIC_URL inclus par {{STATIC_URL}} dans les modèles.

Je suis un peu confus.

86
trikoder_beta

La balise intégrée static template "lie [s] aux fichiers statiques enregistrés dans STATIC_ROOT ".

La balise de template staticfiles de l'application static contrib contribue "utilise le fichier configuré STATICFILES_STORAGE storage pour créer l’URL complète du chemin relatif ", ce qui est" particulièrement utile lors de l’utilisation d’un système de stockage non local pour déployer des fichiers ".

La documentation intégrée de la balise de modèle static (reliée à ci-dessus) contient une note indiquant que vous devez utiliser la balise staticfiles template de static contrib app si vous avez un cas d'utilisation avancé comme utiliser un service cloud pour servir des fichiers statiques ", et voici un exemple:

{% load static from staticfiles %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

Vous pouvez utiliser {% load staticfiles %} plutôt que {% load static from staticfiles %} _ si vous voulez, mais ce dernier est plus explicite.

56
Nick

Je ne sais pas quelle est la différence, mais j’ai trouvé une différence de cas d’utilisation (en utilisant Django 1.9.1 fonctionnant sous Apache, wsgi sur Python = 3.4). Dans mon application, j'ai quelques images dans ImageFields dans la base de données. Si j'utilise un code comme celui-ci dans mon modèle:

<a href="object-{{object.id}}"><img src="{% static object.image %}" height="200px"></a>

alors, si j'utilise {% load static %}, Django montre un TypeError (Cannot mix str and non-str arguments). C'est probablement parce que le object.image n'est pas une chaîne, c'est un ImageField, qui sera converti ultérieurement en chaîne. Cependant, si on utilise {% load staticfiles %} aucune erreur de ce type ne se produit.

Malheureusement, j'ai découvert cette différence après avoir passé des heures à essayer de résoudre le problème. J'ai réussi à trouver une solution de contournement lors de l'utilisation de la première option, à savoir ajouter une méthode de conversion de chaîne à l'objet comme ceci:

#image string
def image_str(self):
    return str(self.image)

J'espère que cette connaissance sera utile à quelqu'un.

5
Deleet

{% load staticfiles %} est très utile lorsque vous utilisez différents stockages comme S3, il sera ensuite converti en URL S3.

1
Dilraj

Reportez-vous à docs , où il existe une explication intéressante. En fait, le {% static %} balise de gabarit connaître l’emplacement de STATICFILE_STORAGE

Comme le dit la documentation:

 {% load static from staticfiles %} <img src="{% static "images/hi.jpg"
 %}" alt="Hi!" /> The previous example is equal to calling the url method of an instance of STATICFILES_STORAGE with "images/hi.jpg".

Cela est particulièrement utile lorsque vous utilisez un système de stockage non local pour déployer des fichiers, comme indiqué dans la section Serveurs statiques à partir d'un service cloud ou d'un CDN.

Si vous souhaitez récupérer une URL statique sans l'afficher, vous pouvez utiliser un appel légèrement différent:

{% load static from staticfiles %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}" alt="Hi!" />

J'espère que ça t'as aidé!!

1
S.Ali

La documentation de Django préfère maintenant {% load static %}.

{% load staticfiles %} fonctionne mais je pense que c'est obsolète.

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#static

0
Uri