Comment puis-je faire apparaître un favicon dans mon application django?

148

Je veux simplement déposer le favicon.icodans mon staticfilesrépertoire, puis le faire apparaître dans mon application.

Comment puis-je accomplir cela?

J'ai placé le favicon.icofichier dans mon staticfilesrépertoire, mais il n'apparaît pas et je vois ceci dans mon journal:

127.0.0.1 - - [21/Feb/2014 10:10:53] "GET /favicon.ico HTTP/1.1" 404 -

Si je vais à http://localhost:8000/static/favicon.ico, je peux voir le favicon.

Jononomo
la source
5
L'erreur GET /favicon.icone GET /static/favicon.icoregarde pas dans http://localhost:8000/static/favicon.icon'est pas liée. Il ressemble à certaines demandes de navigateurs pour /favicon.icole HTML.
gelé

Réponses:

168

Si vous avez un modèle de base ou d'en-tête qui est inclus partout, pourquoi ne pas y inclure le favicon avec du HTML de base?

<link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}"/>
hanleyhansen
la source
Ça semble être une bonne idée. Pouvez-vous m'indiquer un lien qui explique comment procéder?
jononomo
3
Ouais. Quelque chose comme:{{STATIC_URL}}favicon.ico
karthikr
16
C'est juste un exemple. Modifiez-le en fonction de vos besoins.
hanleyhansen
3
Cette réponse n'a pas fonctionné pour moi, mais d'autres réponses utilisées l'ont href="{% static 'favicon.ico' %}fait.
Bezewy
4
Le type MIME ( image/png) et le format de fichier ( favicon.ico) ne correspondent pas.
x-yuri
122

Une astuce légère consiste à faire une redirection dans votre urls.pyfichier, par exemple ajouter une vue comme ceci:

from django.views.generic.base import RedirectView

favicon_view = RedirectView.as_view(url='/static/favicon.ico', permanent=True)

urlpatterns = [
    ...
    re_path(r'^favicon\.ico$', favicon_view),
    ...
]

Cela fonctionne bien comme une astuce facile pour faire fonctionner les favicons lorsque vous n'avez pas vraiment d'autre contenu statique à héberger.

wim
la source
3
Je ne vois pas en quoi c'est léger, comparé à l'ajout de deux lignes au modèle. Et c'est une sorte d'astuce que je n'utiliserais pas en production.
x-yuri
16
@ x-yuri L'autre réponse est plus simple, si vous avez un modèle de base . Le fait est que vous n'avez peut-être pas de modèle ou de contenu statique, donc STATIC_URL peut même ne pas être configuré. par exemple, c'est une API json. mais veulent toujours une API navigable sans voir les erreurs 404 dans vos journaux (chrome, etc. essaiera de demander automatiquement favicon.ico). Il n'y a aucun mal à utiliser un tel RedirectView en production.
wim
56

Dans le fichier modèle

{% load static %}

Puis dans la <head>balise

<link rel="shortcut icon" href="{%  static 'favicon.ico' %}">

Cela suppose que vous ayez des fichiers statiques configurés de manière appropriée dans settings.py.


Remarque : les anciennes versions de Django utilisent load staticfiles, non load static.

Hareem Adderley
la source
31

Solution universelle

Vous pouvez afficher le favicon dans Django de la même manière que vous pouvez le faire dans n'importe quel autre framework: utilisez simplement du HTML pur.

Ajoutez le code suivant à l'en-tête de votre modèle HTML.
Mieux, à votre modèle HTML de base si le favicon est le même dans votre application.

<link rel="shortcut icon" href="{% static 'favicon/favicon.png' %}"/>

Le code précédent suppose:

  1. Vous avez un dossier nommé 'favicon' dans votre dossier statique
  2. Le fichier favicon porte le nom 'favicon.png'
  3. Vous avez correctement défini la variable de réglage STATIC_URL

Vous pouvez trouver des informations utiles sur la prise en charge du format de fichier et sur l'utilisation des favicons dans cet article de Wikipedia https://en.wikipedia.org/wiki/Favicon .
Je peux recommander l'utilisation .pngpour la compatibilité universelle du navigateur.

EDIT:
Comme publié dans un commentaire,
"N'oubliez pas d'ajouter {% load staticfiles %}en haut de votre fichier de modèle!"

ePi272314
la source
Astuce: favicon.ico ne l'a pas fait pour moi, après avoir testé avec l'extension .png cela a fonctionné!
kaya
Vous avez raison @kaya. Le format .ico n'est pas le meilleur en termes de compatibilité. Cependant .png fonctionne toujours.
ePi272314
15

Dans votre settings.pyrépertoire add a root staticfiles:

   STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
        ]

Créer /static/images/favicon.ico

Ajoutez le favicon à votre modèle (base.html):

{% load static %}
<link rel="shortcut icon" type="image/png" href="{% static 'images/favicon.ico' %}"/>

Et créez une redirection d'URL dans urls.pycar les navigateurs recherchent un favicon dans/favicon.ico

from django.contrib.staticfiles.storage import staticfiles_storage
from django.views.generic.base import RedirectView

urlpatterns = [
    ...
    path('favicon.ico', RedirectView.as_view(url=staticfiles_storage.url('images/favicon.ico')))
]
Mustapha-Belkacim
la source
9
<link rel="shortcut icon" href="{% static 'favicon/favicon.ico' %}"/>

Ajoutez simplement cela dans votre fichier de base comme première réponse mais l'extension ico et ajoutez-le au dossier statique

A.Raouf
la source
4

si vous avez la permission alors

Alias /favicon.ico /var/www/aktel/workspace1/PyBot/PyBot/static/favicon.ico

ajoutez un alias à votre hôte virtuel. (dans le fichier de configuration Apache) de même pour robots.txt

Alias /robots.txt /var/www/---your path ---/PyBot/robots.txt
Saurabh Chandra Patel
la source
3

La meilleure solution est de remplacer le modèle Django base.html. Créez un autre modèle base.html dans le répertoire admin. Créez d'abord un répertoire d'administration s'il n'existe pas.app/admin/base.html.

Ajouter {% block extrahead %}au modèle de remplacement.

{% extends 'admin/base.html' %}
{% load staticfiles %}
{% block javascripts %}
    {{ block.super }}
<script type="text/javascript" src="{% static 'app/js/action.js' %}"></script>

{% endblock %}

{% block extrahead %}
    <link rel="shortcut icon" href="{% static 'app/img/favicon.ico'  %}" />
{% endblock %}
{% block stylesheets %}

    {{ block.super }}
{% endblock %}
Basant Kumar
la source
3
        <link rel="shortcut icon" type="image/png" href="{% static 'favicon/sample.png' %}" />

Exécutez également: python manage.py collectstatic

sanka nanaji
la source
2

J'ai essayé les paramètres suivants dans django 2.1.1

base.html

<head>
  {% load static %}
  <link rel="shortcut icon" type="image/png" href="{% static 'images/favicon.ico' %}"/>
</head>

settings.py

 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
 STATIC_URL = '/static/'` <br>`.............

Structure du répertoire du projet

Image

voir en direct ici

MAK Azad
la source
1

Copiez simplement votre favicon sur: / yourappname / mainapp (ex: core) / static / mainapp (ex: core) / img

Ensuite, allez dans votre modèle mainapp (ex: base.html) et copiez-le simplement après {% load static%} car vous devez d'abord charger les statiques.

<link href="{% static 'core/img/favi_x.png' %}" rel="shortcut icon" type="image/png" />
Carlos J. Oliva Domínguez
la source
0

Les meilleures pratiques :

Contrairement à ce que vous pensez, le favicon peut être de n'importe quelle taille et de n'importe quel type d'image. Suivez ce lien pour plus de détails.

Ne pas mettre de lien vers votre favicon peut ralentir le chargement de la page.

Dans un projet django, supposons que le chemin vers votre favicon soit:

myapp/static/icons/favicon.png

dans vos templates django (de préférence dans le template de base), ajoutez cette ligne en tête de page:

<link rel="shortcut icon" href="{%  static 'icons/favicon.png' %}">

Remarque :

Nous supposons que les paramètres statiques sont bien configurés dans settings.py.

Alouani Younes
la source