Jak mogę sprawić, by favicon pojawił się w mojej aplikacji django?

148

Chcę tylko wrzucić favicon.icoplikstaticfiles katalogu, a następnie wyświetlić go w mojej aplikacji.

Jak mogę to osiągnąć?

Umieściłem favicon.icoplik w moim staticfileskatalogu, ale nie pojawia się i widzę to w moim dzienniku:

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

Jeśli pójdę do http://localhost:8000/static/favicon.ico, zobaczę favicon.

jononomo
źródło
5
Błąd GET /favicon.iconie GET /static/favicon.icowyszukuje http://localhost:8000/static/favicon.iconie jest powiązany. Wygląda na to, że niektóre przeglądarki /favicon.icożądają od HTMLa.
zamrożono

Odpowiedzi:

168

Jeśli masz szablon bazowy lub nagłówkowy, który jest zawarty wszędzie, dlaczego nie dołączyć tam ikony ulubionych z podstawowym kodem HTML?

<link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}"/>
hanleyhansen
źródło
Brzmi jak dobry pomysł. Czy możesz wskazać mi link, który wyjaśnia, jak to zrobić?
jononomo
3
Tak. Coś jak:{{STATIC_URL}}favicon.ico
karthikr
16
To tylko przykład. Zmodyfikuj go, aby pasował do swoich potrzeb.
hanleyhansen
3
Ta odpowiedź nie zadziałała dla mnie, ale inne odpowiedzi, które użyłem, href="{% static 'favicon.ico' %}tak.
Bezewy
4
Typ MIME ( image/png) i format pliku ( favicon.ico) nie są zgodne.
x-yuri
122

Jedną z lekkich sztuczek jest utworzenie przekierowania w urls.pypliku, np. Dodanie takiego widoku:

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

Działa to dobrze jako prosta sztuczka, dzięki której favicony działają, gdy tak naprawdę nie masz innej statycznej zawartości do hostowania.

wim
źródło
3
Nie rozumiem, jak to jest lekkie w porównaniu z dodaniem dwóch linii do szablonu. I to jest sztuczka, której nie użyłbym w produkcji.
x-yuri
16
@ x-yuri Inna odpowiedź jest łatwiejsza, jeśli w ogóle masz szablon bazowy . Chodzi o to, że możesz nie mieć żadnego szablonu ani treści statycznej, więc STATIC_URL może nawet nie zostać skonfigurowany. np. to json API. ale nadal potrzebujesz interfejsu API z możliwością przeglądania bez wyświetlania błędów 404 w dziennikach (chrome itp. spróbuje automatycznie zażądać favicon.ico). Używanie takiego RedirectView w środowisku produkcyjnym nie jest szkodliwe.
wim
56

W pliku szablonu

{% load static %}

Następnie w <head>tagu

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

Zakłada się, że masz odpowiednio skonfigurowane pliki statyczne w settings.py.


Uwaga : starsze wersje Django użytku load staticfiles, nie load static.

Hareem Adderley
źródło
31

Uniwersalne rozwiązanie

Możesz wyświetlić ikonę favicon w Django w taki sam sposób, jak w każdym innym frameworku: po prostu użyj czystego HTML.

Dodaj następujący kod do nagłówka szablonu HTML.
Lepiej do podstawowego szablonu HTML, jeśli ikona ulubionych jest taka sama w całej aplikacji.

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

Poprzedni kod zakłada:

  1. Masz folder o nazwie „favicon” w swoim folderze statycznym
  2. Plik favicon ma nazwę „favicon.png”
  3. Prawidłowo ustawiłeś zmienną STATIC_URL

Przydatne informacje na temat obsługi formatów plików i korzystania z ikon ulubionych można znaleźć w tym artykule w Wikipedii https://en.wikipedia.org/wiki/Favicon .
Mogę polecić użycie.png dla uniwersalnej kompatybilności przeglądarki.

EDYCJA:
Jak napisano w jednym komentarzu:
„Nie zapomnij dodać {% load staticfiles %}na początku pliku szablonu!”

ePi272314
źródło
Tipp: favicon.ico nie zrobił tego za mnie, po przetestowaniu z rozszerzeniem .png zadziałało!
kaya,
Masz rację @kaya. Format .ico nie jest najlepszy pod względem zgodności. Jednak .png zawsze działa.
ePi272314
15

W settings.pydodaniu głównego katalogu plików statycznych:

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

Stwórz /static/images/favicon.ico

Dodaj ikonę ulubionych do swojego szablonu (base.html):

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

I utwórz przekierowanie adresu URL, urls.pyponieważ przeglądarki szukają favicon w/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
źródło
9
<link rel="shortcut icon" href="{% static 'favicon/favicon.ico' %}"/>

Po prostu dodaj to w pliku bazowym ur, jak pierwsza odpowiedź, ale rozszerzenie ico i dodaj do folderu statycznego

A.Raouf
źródło
4

jeśli masz wtedy pozwolenie

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

dodaj alias do swojego wirtualnego hosta. (w pliku konfiguracyjnym Apache) podobnie dla pliku robots.txt

Alias /robots.txt /var/www/---your path ---/PyBot/robots.txt
Saurabh Chandra Patel
źródło
3

Najlepszym rozwiązaniem jest zastąpienie szablonu Django base.html. Utwórz kolejny szablon base.html w katalogu administratora. Utwórz najpierw katalog administratora, jeśli nie istnieje.app/admin/base.html.

Dodaj {% block extrahead %}do nadpisującego szablonu.

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

Uruchom także: python manage.py collectstatic

sanka nanaji
źródło
2

Wypróbowałem następujące ustawienia w 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>`.............

Struktura katalogów projektu

Wizerunek

zobacz na żywo tutaj

MAK Azad
źródło
1

Po prostu skopiuj favicon na: / yourappname / mainapp (ex: core) / static / mainapp (ex: core) / img

Następnie przejdź do szablonu mainapp (np. Base.html) i po prostu skopiuj to, po {% load static%}, ponieważ musisz najpierw załadować statystyki.

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

Najlepsze praktyki :

W przeciwieństwie do tego, co myślisz, ikona ulubionych może mieć dowolny rozmiar i dowolny typ obrazu. Kliknij ten link, aby uzyskać szczegółowe informacje.

Brak linku do favikony może spowolnić ładowanie strony.

Załóżmy, że w projekcie django ścieżka do Twojego favicon to:

myapp/static/icons/favicon.png

w swoich szablonach django (najlepiej w szablonie podstawowym) dodaj tę linię do nagłówka strony:

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

Uwaga :

Przypuszczamy, że ustawienia statyczne są dobrze skonfigurowane w settings.py.

Alouani Younes
źródło