Framework Django – pierwsze kroki – cz. 2

W poście Framework Django – pierwsze kroki przedstawiłem w jaki sposób utworzyć projekt w Django, jak dodać prosty widok, jak skonfigurować podstawowy routing oraz jak przygotować bazę danych. W poniższym poście skupię się przede wszystkim na rozbudowie widoków, za pomocą których użytkownik będzie mieć możliwość interakcji z budowaną aplikacją.

Przygotowanie szablonu oraz pliku ze stylami

Dla czytelności pisanego kodu oraz ułatwienia zarządzania nim w przyszłości warto szablony widoków (kod HTML) oraz pliki statyczne wykorzystywane w szablonie (arkusze stylów CSS, skrypty JavaScript) umieszczać poza kodem w Pythonie. W przykładzie wykorzystany zostanie prosty widoku zapisany w pliku css.html:

<html>
<head>
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'app/style.css' %}" />
</head>
<p>template with css</p>
</html>

W szablonie wykorzystane zostało wyrażenie {% load static %} pozwalające załadować pliki statyczne z katalogu zdefiniowanego w ustawieniach aplikacji tj. w pliku settings.py:

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

Plik CSS style.css, do którego odwołujemy się w szablonie, ma postać:

body {
 background-color: black;
 color: white;
}

Wykorzystanie szablonu w przykładowym widoku

W kodzie serwera w Pythonie wykorzystanie szablonu sprowadza się do użycia get_template():

from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader

def css(request):
    template = loader.get_template('app/css.html')
    context = { }
    return HttpResponse(template.render(context, request))

Wdrożenie aplikacji z szablonami i plikami statycznymi

Umieszczając aplikację na serwerze produkcyjnym trzeba przygotować pliki statyczne za pomocą polecenia:

python3 manage.py collectstatic

które pliki statyczne umieści w katalogu zdefiniowanym w pliku settings.py:

STATIC_ROOT = os.path.join(BASE_DIR, 'collectstatic')

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Time limit is exhausted. Please reload CAPTCHA.