Como faço para que um favicon apareça no meu aplicativo django?

148

Eu só quero soltar o favicon.icono meu staticfilesdiretório e depois aparecer no meu aplicativo.

Como posso fazer isso?

Coloquei o favicon.icoarquivo no meu staticfilesdiretório, mas ele não aparece e vejo isso no meu log:

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

Se eu for http://localhost:8000/static/favicon.ico, posso ver o favicon.

jononomo
fonte
5
O erro GET /favicon.iconão está GET /static/favicon.icoolhando http://localhost:8000/static/favicon.iconão está relacionado. Parece que alguns pedidos de navegadores /favicon.icodesprezam o HTML.
congelado

Respostas:

168

Se você tem um modelo de base ou cabeçalho incluído em todos os lugares, por que não incluir o favicon no HTML básico?

<link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}"/>
hanleyhansen
fonte
Parece uma boa ideia. Você pode me indicar um link que explica como fazer isso?
Jononomo
3
Sim. Algo como:{{STATIC_URL}}favicon.ico
karthikr
16
Isso é apenas um exemplo. Modifique-o para atender às suas necessidades.
precisa saber é o seguinte
3
Essa resposta não funcionou para mim, mas outras respostas que funcionaram href="{% static 'favicon.ico' %}.
Bezewy
4
O tipo MIME ( image/png) e o formato do arquivo ( favicon.ico) não correspondem.
X-yuri
122

Um truque leve é ​​fazer um redirecionamento no seu urls.pyarquivo, por exemplo, adicione uma visualização da seguinte forma:

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),
    ...
]

Isso funciona bem como um truque fácil para fazer com que os favoritos funcionem quando você realmente não tem outro conteúdo estático para hospedar.

wim
fonte
3
Não vejo como isso é leve, comparado à adição de duas linhas ao modelo. E esse é um tipo de truque que eu não usaria na produção.
X-yuri
16
@ x-yuri A outra resposta é mais fácil, se você tiver um modelo básico . O ponto é que você pode não ter nenhum modelo ou conteúdo estático, portanto, STATIC_URL pode até não estar configurado. por exemplo, é uma API json. mas ainda deseja uma API navegável sem ver erros 404 em seus registros (o chrome etc tentará solicitar o favicon.ico automaticamente). Não há nenhum dano em usar esse RedirectView na produção.
Wim
56

No arquivo de modelo

{% load static %}

Em seguida, dentro da <head>tag

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

Isso pressupõe que você tenha arquivos estáticos configurados adequadamente em settings.py.


Nota : versões mais antigas do Django usam load staticfiles, não load static.

Hareem Adderley
fonte
31

Solução universal

Você pode obter o favicon aparecendo no Django da mesma maneira que em qualquer outra estrutura: basta usar HTML puro.

Adicione o seguinte código ao cabeçalho do seu modelo HTML.
Melhor, para o seu modelo HTML básico, se o favicon for o mesmo em seu aplicativo.

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

O código anterior assume:

  1. Você tem uma pasta chamada 'favicon' na sua pasta estática
  2. O arquivo favicon tem o nome 'favicon.png'
  3. Você definiu corretamente a variável de configuração STATIC_URL

Você pode encontrar informações úteis sobre o suporte ao formato de arquivo e como usar os favoritos neste artigo da Wikipedia https://en.wikipedia.org/wiki/Favicon .
Posso recomendar o uso .pngpara compatibilidade universal com navegadores.

EDIT:
Como publicado em um comentário,
"Não se esqueça de adicionar {% load staticfiles %}no topo do seu arquivo de modelo!"

ePi272314
fonte
Tipp: favicon.ico não fez isso por mim, depois de testar com a extensão .png, funcionou!
kaya
Você está certo @kaya. O formato .ico não é o melhor em relação à compatibilidade. No entanto, .png sempre funciona.
EPi272314
15

No seu settings.pydiretório add staticfiles raiz:

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

Crio /static/images/favicon.ico

Adicione o favicon ao seu modelo (base.html):

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

E crie um redirecionamento de URL urls.pyporque os navegadores procuram um favicon em/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
fonte
9
<link rel="shortcut icon" href="{% static 'favicon/favicon.ico' %}"/>

Basta adicionar isso no seu arquivo base, como a primeira resposta, mas a extensão ico, e adicioná-lo à pasta estática

A.Raouf
fonte
4

se você tiver permissão então

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

adicione o alias ao seu host virtual. (no arquivo de configuração do apache) da mesma forma para o robots.txt

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

A melhor solução é substituir o modelo Django base.html. Crie outro modelo base.html no diretório admin. Crie um diretório admin primeiro se ele não existir.app/admin/base.html.

Adicione {% block extrahead %}ao modelo de substituição.

{% 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
fonte
3
        <link rel="shortcut icon" type="image/png" href="{% static 'favicon/sample.png' %}" />

Execute também: python manage.py collectstatic

sanka nanaji
fonte
2

Eu tentei as seguintes configurações no 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>`.............

Estrutura de diretório do projeto

Imagem

ver ao vivo aqui

MAK Azad
fonte
1

Basta copiar seu favicon em: / yourappname / mainapp (ex: core) / static / mainapp (ex: core) / img

Em seguida, vá para o modelo do seu mainapp (ex: base.html) e copie isso depois de {% load static%}, porque você deve carregar primeiro as estatísticas.

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

Melhores Práticas :

Ao contrário do que você pensa, o favicon pode ser de qualquer tamanho e tipo de imagem. Siga este link para obter detalhes.

Não colocar um link para seu favicon pode atrasar o carregamento da página.

Em um projeto django, suponha que o caminho para seu favicon seja:

myapp/static/icons/favicon.png

nos seus modelos de django (de preferência no modelo base), adicione esta linha ao cabeçalho da página:

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

Nota :

Supomos que as configurações estáticas estão bem definidas em settings.py.

Alouani Younes
fonte