Szybkie wprowadzenie w świat django.
Pomijam instalowanie Django – opis znajdziesz tutaj.
Tworzenie nowego projektu
W linii poleceń wpisz:
django-admin.py startproject faststart
Utworzy to nowy projekt faststart, wraz z podstaowymi plikami, w tym plikiem konfiguracyjnym (settings.py) i plikiem mapowania adresów URL (urls.py).
Uruchamiamy serwer
Django ma wbudowany serwer HTTP, idealnie nadający się do celów developerskich. Aby go uruchomić, wejdź do folderu projektu nad jakim pracujesz i w konsoli wpisz:
python manage.py runserver

Po chwili zobaczysz coś takiego. Wpisz w przeglądarce http://127.0.0.1:8000/ - właśnie pod portem 8000 wystartował nasz testowy serwer. Powinieneś zobaczyć taką stronę.

Konfiguracja
Przykład oprzemy o SQLite, ale w zasadzie poprzez zmianę w konfiguracji, przykład zadziała na każdej inne bazie;-)
Otwórz plik settings.py. Odszukaj z nim zmiennej DATABASES:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
zmodyfikuj ją tak:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': './test.db', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
Teraz poszuka zmiennej INSTALLED_APPS i odkomentuj linijkę:
'django.contrib.admin',
Dzięki czemu będziesz miał dostęp do panelu administracyjnego Django – to on jest w głównej mierze siłą tego frameworka.
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)
Baza danych
przejdź teraz ponownie do linii poleceń. Wpisz w niej:
python manage.py syncdb
Spowoduje to założenie niezbędnych tabel. Zostaniesz też zapytany, czy chcesz założyć konto super użytkownika – pewnie, że chcesz;-)
Zaczynamy
I teraz w zasadzie dopiero naprawdę zaczynamy zabawę. Aplikację w django składają się z tak zwanych:D aplikacji;-) Zobacz modyfikowaną wcześniej zmienną INSTALLED_APPS w settings.py. Tam są właśnie wymienione aplikacje, z jakich składać się będzie Twoja strona.
A więc zaczynamy. Stwórzmy sobie aplikację news. W linii poleceń wpisz:
python manage.py startapp newses

Spowoduje to utworzenie w projekcie katalogu newses, a w nim plików: __init__.py, models.py, tests.py oraz views.py. Nazwy plików same tłumaczą swoją zawartość.
Stwórzmy więc model, opisujący nasze newsy. Otwórz plik models,py i dopisz w nim:
# -*- coding: utf-8 -*-
from django.db import models
class News(models.Model):
subject = models.CharField(max_length=100)
content = models.TextField()
date = models.DateField()
W ten sposób tworzymy model News, z trzema polami – subject, na tytuł newsa, content na jego treść i date na datę utworzenia. Zauważ, że temat otrzymał parametr ograniczający jego długość do 100 znaków.
Musimy dodać jeszcze naszą aplikację w pliku konfiguracyjnym, do krotki INSTALLES_APPS:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'newses'
)
i wykonać synchronizację naszej bazy. Najpierw jednak z poziomy linii poleceń wpisz (ale nie w katalogu aplikacji news, a z katalogu w którym znajduje się m.in. nasz plik settings.py):
python manage.py sql newses

Dzięki temu, zobaczysz jakie tabele są generowane przez model aplikacji newses. Teraz aby założyć odpowiednie tabele, wydaj polecenie:
python manage.py syncdb

Zanim przejdziemy dalej, zajrzyjmy do panelu administarcyjnego. Żeby móc się do niego zalogować, musisz jeszcze wyedytować plik urls.py. Musi on wyglądać tak:
from django.conf.urls.defaults import patterns, include, url
# Odkomentuj obie poniższe linie
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'faststart.views.home', name='home'),
# url(r'^faststart/', include('faststart.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Odkomentuj poniższą linię
url(r'^admin/', include(admin.site.urls)),
)
Teraz odwiedź stronę http://127.0.0.1:8000/admin/. Zobaczysz okno do logowania. Podaj w nim nazwę użytkownika oraz hasło jakie podałeś podczas inicjacji bazy danych, dla super użytkownika.
Po zalogowaniu zobaczysz podstawową wersję panelu adminsitarcyjnego. Dążymy teraz do tego, aby pojawiły się tu nasze newsy.


Wróćmy więc do naszej aplikacji. Utwórz nowy plik admin.py w katalogu aplikacji (newses). W nim zarejestrujemy nasz model w panelu administracyjnym. W tym celu wpisz w nim:
from newses.models import News # import naszego modelu
from django.contrib import admin
admin.site.register(News) # rejestracja modelu w PA
Teraz odśwież stronę z panelem administracyjnym (jeśli nic się nie zmieni, zrestartuj uruchomiony serwer Django).



Troszkę polskiego
Jak widzisz cały panel administracyjny jest po Angielsku. Zróbmy coś z tym. Otwórz plik settings.py i odszukaj w nim zmiennej LANGUAGE_CODE. Ustaw jej wartość na pl-PL. Warto też zmodyfikować zmienną TIME_ZONE na Europe/Warsaw. Teraz odśwież PA.

Prawie wszystko jest po polsku. Niestety nasz model ma dość dziwną nazwę – Newss. Wróćmy więc do pliku models.py.
Dodajmy w nim podklasę Meta, w której zdefiniujemy nazwę modelu, oraz nazwę dla liczby mnogiej:
# -*- coding: utf-8 -*-
from django.db import models
class News(models.Model):
subject = models.CharField(max_length=100)
content = models.TextField()
date = models.DateField()
class Meta:
verbose_name = u'Aktualność'
verbose_name_plural = u'Aktualności'

Nie zapomnij o komentarzu w pierwszej linii, wskazującym, że kodowanie pliku to utf-8.
Odśwież teraz stronę PA. Prawie dobrze. Niestety jak klikniesz dodaj przy aktualnościach, opisu pól są nadal brane z nazw pól naszego modelu.

Otwórz więc raz jeszcze plik naszego modelu i zmodyfikuje następująco:
# -*- coding: utf-8 -*-
from django.db import models
from datetime import datetime
class News(models.Model):
subject = models.CharField(max_length=100, verbose_name=u'Tytuł')
content = models.TextField(verbose_name=u'Treść')
date = models.DateField(default=datetime.now, verbose_name=u'Data utworzenia')
class Meta:
verbose_name = u'Aktualność'
verbose_name_plural = u'Aktualności'
W ten sposób ustaliliśmy nazwy dla naszych pól w formularzu. Zobacz także zmienną default przy polu date. W ten sposób ustaliliśmy domyślną wartość pola – zostanie w nim wpisana bieżąca data.
Dodaj teraz kilka testowych newsów. Jak widzisz, na liście newsós nazwy nie wyświetlają się poprawnie. Zróbmy z tym coś. Wystarczy do naszej klasy modelu, dodać metodę __unicode__, która zwrócić naszwę konkretengo rekordu. A więc ostateczna na dziś forma modelu:
# -*- coding: utf-8 -*-
from django.db import models
from datetime import datetime
class News(models.Model):
subject = models.CharField(max_length=100, verbose_name=u'Tytuł')
content = models.TextField(verbose_name=u'Treść')
date = models.DateField(default=datetime.now, verbose_name=u'Data utworzenia')
def __unicode__(self):
return self.subject
class Meta:
verbose_name = u'Aktualność'
verbose_name_plural = u'Aktualności'

Front
Nadszedł czas zadbać o front, wyświetlający nasze newsy. Utwórz w katalogu newses katalog templates/newses a w nim plik news_list.html.
Zawartość tego pliku, to szablon HTML, naszej strony z listą newsów:
<html>
<head>
<title>Aktualności</title>
</head>
<body>
<h1>Aktualności</h1>
{% for news in object_list %}
<li><a href="/news/{{ news.id }}">{{ news.subject }}</a></li>
{% endfor %}
</body>
</html>
Teraz przejdź do pliku urls.py dodaj importy:
from django.views.generic import ListView
from newses.models import News
a w zmiennej urlpatterns wpis:
url(r'^$', ListView.as_view(model=News,)),
Dzięki temu, strona główna będzie odpalała widok ListView, on zaś będzie wyświetlał szablon znajdujący się w folderze newses/templates/newses/news_list.html. Ścieżka ta jest budowana następująco:
/nazwa_aplikacji/templates/nazwa_aplikacji/nazwa_modelu_list.html

W szablonie, w zmiennej object_list znajduje się lista obiektów naszego modelu.
I jeszcze detal aktulaności. Szablon zapisz w pliku newses/templates/newses/news_detail.html:
<html>
<head>
<title>Aktualność: {{ object.subject }}</title>
</head>
<body>
<h1>{{ object.subject }}</h1>
<div>
<div>{{ object.date }}</div>
<p>{{ object.content }}</p>
</div>
</body>
</html>
W pliku urls.py dodaj import
from django.views.generic import DetailView
a w zmiennej urlpatterns dodaj:
url(r'^news/(?P<pk>\d+)/$', DetailView.as_view(model=News)),
Spowoduje to zmapowanie urli /news/ID do widoku DetailView, który wyświetli szablon newses/templates/newses/news_detail.html. W nim zaś, dostęp do modelu będziesz miał przez zmienną object.

I to tyle
I to tyle na dziś:-) To jest w zasadzie tylko liźnięcie Django. Jeśli wydaje Ci się, że duże trzeba zrobić, żeby napisać tak prostą aplikację, zobacz wersję skróconą tego wpisu;-)
Dalej rozbudujemy nasz prosty systemik:-)
A tutaj projekt do pobrania.