Wykład 7: Django - szerzej
Andrzej Krajka
Django – konfiguracja mediów
STATIC_ROOT – (domyślnie ‘’) – “bezwzględna” ścieżka do katalogu z kolekcją zbiorów statycznych (np. "/home/example.com/static/")
STATIC_URL – (domyślnie None) – adres URL odpowiadający zbiorom ulokowanym w STATIC_ROOT. w którym Django pokazuje zbiory
“bezwzględna” ścieżka do katalogu z kolekcją zbiorów statycznych (np.
"/static/")
MEDIA_ROOT – (domyślnie ‘’) – “bezwzględna” ścieżka do katalogu z kolekcją zbiorów dynamicznych (np. "/home/example.com/media/")
MEDIA_URL – (domyślnie None) – adres URL odpowiadający zbiorom ulokowanym w MEDIA_ROOT w którym Django pokazuje zbiory
“bezwzględna” ścieżka do katalogu z kolekcją zbiorów dynamicznych (np.
"/media/")
<link href="{{STATIC_URL}}css/main.css" media="screen"
rel="stylesheet" type="text/css" />
<img src="{{MEDIA_URL}}random.jpg"/>
STATICFILES_DIRS – (domyślnie ‘’) – dodatkowa lokalizacja na dysku plików statycznych (te katalogi będzie Django przeszukiwać)
Django zbiera potrzebne pliki ze STATICFILES_DIRS i kopiuje je do
STATIC_ROOT.
Django – konfiguracja mediów
# Konfiguracja grafiki
_PATH = os.path.abspath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(_PATH, 'files', 'media')
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(_PATH, 'files', 'static')
STATIC_URL = '/static/‘
STATICFILES_DIRS = (
os.path.join(_PATH, 'static'),
)
<img src="{{ STATIC_URL }}images/hi.jpg" />
Django – konfiguracja mediów
Kojarzenie adresów plików *_ROOT z adresami URL
*_URL
from settings import MEDIA_ROOT, MEDIA_URL from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns() Efekt: http://localhost:8000/static/bhp1.jpg
http://localhost:8000/media/media/bhp2.jpg
Adresy URL
Obiekt urlpatterns
Składa się z:
Prefiks – łańcuch (może być pusty), „dolepiany” na początku każdej funkcji widoku
Jedna lub więcej krotek – z których każda zawiera wyrażenie regularne dopasowujące jeden lub wiele adresów URL, funkcję widoku w postaci obiektu (wtedy można stosować dekoratory) lub łańcucha znaków, oraz (dodatkowo) słownik z argumentami dla tej funkcji.
Adres –
r – wyrażenie regularne (brak znaków sterujących)
^ - dopasownie od początku np. r’bar/’ pasuje do ‘/foo/bar’ jak i ‘/bar/’
$ - dopasowanie do końca.
Django usuwa pierwszy ukośnik rozpoczynający adres tzn. r’bar/’ i r’/bar/’ są równoważne
(?P<identyfikator>) – tzw. „grupy symboliczne” służące do
przechwytywania części adresu jako parametry procedury
Adresy URL
Wyrażenia regularne – moduł re
Symbol Dopasowanie
. (kropka) Dowolny pojedynczy znak z wyjątkiem nowej linii
\d Dowolna pojedyncza cyfra
[A-Z] Dowolny znak między A i Z (duże litery) [a-z]
[A-Za-z]
Dowolny znak między a i z (małe litery)
Dowolny znak między a i z (bez względu na wielkość znaku) + Jedno lub więcej powtórzeń poprzedniego wyrażenia (np. \d+
dopasowuje się do jednej lub więcej cyfr)
[^/]+ Jeden lub więcej znaków aż do (ale bez) znaku ukośnika
? Brak lub jedno wystąpienie poprzedniego wyrażenia (np. \d?
dopasowuje się do zera lub jednej cyfry)
* Zero lub więcej powtórzeń poprzedniego wyrażenia (np., \d*
dopasowuje się do zera lub więcej cyfr)
^ Dopasowanie łańcucha do początku
$ Dopasowanie łańcucha do końca
{1,3} Od jednego do trzech (łącznie z trzema) powtórzeń poprzedniego wyrażenia (np. \d{1,3} dopasowuje się od jednej do trzech cyfr)
Adresy URL – krotki i metody
•
Krotka URL
urlpatterns=patterns(‘projekt.app.views’, (r’^$’, ‘index’),
(r’^archives/(P?<rok>\d{4})/(?P<miesiac>\d{2})/(?P<dzien>)$’, archive),
)
•
Metoda URL
urlpatterns=patterns(‘projekt.app.views’,
url(r’^$’, ‘index’,{‘wartosc’:”index”, ‘x’:7}, name=‘indeks’),
url(r’^archives/(P?<rok>\d{4})/(?P<miesiac>\d{2})/(?P<dzien>)$’, archive, {‘wartosc’:7}, name=‘archiwa’),
)
• Import adresów URL
urlpatterns+=patterns(‘’,
(r’^hej$’, include(‘projekt.prog.urls’)), )
urlpatterns+=patterns(‘projekt.prog.views’,
url(r’^inny_adres/$, ‘show’, {‘wartosc’:”pokaz”, ‘x’:1.3}, name=‘show’),
)
Django – Szablony
Zmienne {{nazwa[.atrybut][|nazwa filtru|nazwa filtru …]}}
{{ zmienna|nazwa_filtru }}
{{ zmienna|linebreaks }}
stosowanie kilku filtrów {{ zmienna|escape|linebreaks }}
filtr z argumentem {{ zmienna|escape:"argument" }}
{‘nazwa’:zmienna}
zmienna.__unicode__()
Jeśli zmienna „nazwa”nie istnieje to za jej nazwę zostanie
wstawione TEMPLATE_STRING_IF_INVALID z settings.py
Django – Szablony (filtry)
safe - zapobiega enkodowaniu tagów HTML
add - dodaje do zmiennej podaną wartość (zmienna|add:"liczba")
addslashes - dodaje ukośniki
capfirst - Pierwsza litera wyrażenia zmieniana jest na dużą literę.
cut - usuwa wszystkie wystąpienia podanego łańcucha w zmiennej (zmienna|cut:"łańcuch")
date - formatuje zmienną w postaci daty. Taka sama składnia jak "now"
default - jeżeli zmienna jest niedostępna wykorzystuje podaną wartość
default_if_none - to samo z tym że pod warunkiem że zmienna ma wartość None
dictsort - pobiera listę słowników i zwraca ją posortowaną według podanych parametrów
dictsortreversed - to samo tyle że sortuje odwrotnie
divisibleby - zwraca True jeżeli wartość zmiennej dzieli się bez reszty przez podany argument (liczbę)
escape - "ucieka: z formatowania HTML, zamienia < > oraz cudzysłowy
filesizeformat - formatuje podaną wartość do sensownego formatu rozmiaru (KB, MB itd.)
first - Zwraca pierwszy element z listy
fix_ampersands - zamienia & na jego notację znakową (entity)
floatformat - zaokrągla liczby zmiennoprzecinkowe do jednego miejsca po przecinku (jeżeli istnieją liczby po przecinku)
get_digit - pobiera z liczby cyfrę o określonej parametrem lokacji (0 - pierwsza cyfra itd.)
join - łączy listy
length - zwraca długość elementów (np. do list)
length_is - zwraca True jeżeli długość (length) wartość jest argumentem
linebreaks - zamienia przejścia do nowej linii na p i br
linebreaksbr - to samo tyle że stosuje jedynie br
Django – Szablony (filtry)
linenumbers - wyświetla tekst z numerami wierszy
lower - zamienia duże litery na małe
make_list - zamienia wartość na listę
phone2numeric - zamienia wartość na numer telefonu, np. "800-COLLECT" na
"800-2655328". Nie sprawdza "sensu" wyrażenia
pluralize - zwraca sufiks jeżeli wartość nie jest równa 1. Domyślnie zwraca "s"
random - zwraca losowy obiekt z listy
removetags - usuwa tagi X/HTML ze zmiennej (podane jako argument, oddzielone spacją)
slice - zachowuje się jak slice w Pythonie
striptags - usuwa wszystkie tagi X/HTML
time - formatuje wartość jako czas/datę. Taka sama składnia jak "now"
timesince - podaje ile czasu minęło od daty w zmiennej do dziś. Można podać argument - czas odniesienia zamiast bieżącej daty
timeuntil - tak jak wyżej tyle że podaje ile czasu do danego wydarzenia (przyszłość)
title - formatuje łańcuch na tytuł
truncatewords - przycina łańcuch do podanej długości
unordered_list - Przerabia listę na listę li/ul
upper - wszystkie litery zmieniane są na duże
urlencode - koduje zmienne dla URLi
urlize - zamienia linki w zwykłym tekście na odnośniki, w które można kliknąć
urlizetrunc - to co wyżej z tym że przycina je do podanej długości (tytuł linka)
wordcount - zwraca ilość słów
wordwrap - łamie wiersze przy podanej szerokośc
Szablony (Tagi) {% TAG %}
block - dodaje blok, który może być nadpisany przez szablony dzieci
comment - wszystko między {% comment %} i {% endcomment %} jest komentarzem w kodzie i nie pojawi się na stronie
cycle - przechodzi przez podane wartości.
{% for o in some_list %} <tr class="{% cycle row1,row2 %}"> ... </tr> {% endfor %}
debug - wyświetla dane debuggera
extends - oznacza że ten szablon dziedziczy z podanego w tagu szablonu, np:
{% extends "base.html" %}
filter - nakłada podane filtry na tekst między tagami:
{% filter escape|lower %} Tekst {% endfilter %}
firstof - Zwróci pierwszą wartość różną od False lub nic jeżeli takiej nie znajdzie:
{% firstof var1 var2 var3 %}
for - pętla:<ul>
{% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
◦ forloop.counter - numer bieżącej iteracji
◦ forloop.counter0 - numer bieżącej iteracji liczony od 0
◦ forloop.revcounter - numer iteracji od tyłu
◦ forloop.revcounter0 - numer iteracji od tyłu, liczony od 0
◦ forloop.first - zwraca True jeżeli jest to pierwsza iteracja
◦ forloop.last - zwraca True jeżeli jest to ostatnia iteracja
◦ forloop.parentloop - dla zagnieżdżonych pętli, oznacza nadrzędną pętle
if - jeżeli podana zmienna nie ma wartości False to wykona blok między tagami.
{% if athlete_list %} zmienna coś ma... {% else %} zmienna nic nie ma {% endif %}
ifequal - podobnie jak if tyle że sprawdza czy dwie podane zmienna mają te same wartości {% ifequal user.id comment.user_id %} ... {% endifequal %}
ifnotequal - jak powyżej tylko "jeżeli nie równe"
include - ładuje i parsuje szablon: {% include "foo/bar.html" %}
load - ładuje niestandardowy tag
now - pokazuje bieżącą datę, atrybut określa formatowanie. Znaczniki zbliżone do formatowania funkcji date w PHP.
regroup - przegrupowuje elementy.
spaceless - usuwa nadmiarowe spacje, przejścia do nowej linii, w kodzie X/HTML
ssi - ładuje podany plik, wymaga bezwzględnej ścieżki.
Django http (Obiekt QueryDict)
HttpRequest -Obiekt QUERYDICT {klucz:wartość} gdzie wartość zawsze jest listą
request.GET - QUERYDICT związany z metodą GET request.POST - QUERYDICT związany z metodą POST request.REQUEST – któraś z powyższych
request.COOKIES - QUERYDICT związany z COOKIES
request.path – fragment adresu URL (za domeną) związany z żądaniem
request.method – ‘GET’ lub ‘POST’
request.encoding – łańcuch określający kodowanie wykorzystywane do dekodowania wysłanych danych
request.FILES – QUERYDICT zawierające nazwy plików wysłanych przez formularze na stronie
request.META- QUERYDICT zawierający dodatkowe zmienne żądania u serwera nie występujące gdzie indziej
request.user – obiekt uwierzytelnienia użytkownika
request.raw_post_date – surowe, nieprzetworzone dane POST
Django http (Obiekt QUERYDICT)
Metody:
request.get_host()
request.get_full_path() request.is_ajax()
request.is_secure()
QueryDict.__getitem__(key) – wartość danego klucza (jeśli więcej niż jedna to ostatnia)
QueryDict.__setitem__(key, value) – ustawia dla klucza wartość QueryDict.__contains__(key) - True jeśli klucz istnieje
QueryDict.get(key, default) – Tak jak __getitem__() ale gdy nie ma klucza to zwraca wartość (bez sygn. błędu)
QueryDict.update(other_dict) – uaktualnienie z innego QueryDict QueryDict.values()
QueryDict.itervalues()
QueryDict.copy() - (z copy.deepcopy()) QueryDict.getlist(key)
QueryDict.setlist(key, list_)
QueryDict.appendlist(key, item)
QueryDict.urlencode()
models.Model
TYPY PÓL
AutoField - pole IntegerField z automatycznie przyrastającymi wartościami. Zazwyczaj nie trzeba tego używać jako że Django domyślnie dodaje pole id tego typu do tabel.
BooleanField - Pole zawierające wartość Prawda/Fałsz. W panelu admina widoczne jako checkbox.
CharField - pole tekstowe na nieduże ilości tekstu, wymagany parametr max_length określa maksymalną długość. Dla większych ilości tekstu należy stosować TextField. Panel admina przedstawia to jako input text - jednowierszowe pole.
CommaSeparatedIntegerField - liczby całkowite oddzielone przecinkami. Parametr max_length wymagany.
DateField - Pola daty. Panel admina przedstawia to pole jako input text z kalendarzem.
DateTimeField - Data i czas.
EmailField - pole CharField do przechowywania adresów email. Sprawdza poprawność dodawanych danych, nie przyjmuje parametru max_length.
FileField - pole ładowania pliku. Wymaga parametru " upload_to" określającego pełną ścieżkę systemową - katalog, w którym ma być umieszczony plik. Ścieżka może zawierać formatowanie strftime. Dodatkowo należy w konfiguracji projektu określić MEDIA_ROOT - ścieżkę do katalogu z plikami statycznymi (w tym tymi ładowanymi). By ładowanie działało użytkownik, pod którym działa serwer musi mieć prawo zapisu dla podanego katalogu.
upload_to określa nam do jakiego podkatalogu przesłać ładowany plik (względem MEDIA_ROOT). W bazie danych zapisana zostanie relatywna ścieżka do pliku względem MEDIA_ROOT. By w szablonie uzyskać pełną ścieżkę zastosuj
{{ object.get_NAZWAPOLA_url }}
FilePathField - pole z wyborem ograniczonym do nazw plików z określonego katalogu.
Posiada trzy dodatkowe argumenty: path (wymagany) - określa ścieżkę do katalogu, z którego pole ma czerpać listę plików, match - wyrażenie regularne używane do filtrowania dostępnych plików. recursive - określa czy zawartość podkatalogów również powinna być uwzględniania, domyślnie False.
FilePathField(path="/home/images", match="foo.*", recursive=True)
models.Model
DecimalField, FloatField - pola dla liczb zmiennoprzecinkowych odpowiednio dla Pythonowych obiektów Decimal i Float. Wymaga dwóch dodatkowych argumentów: max_digits - maksymalna ilość cyfr, decimal_places - ilość cyfr po przecinku.
Przykład, by zapisywać liczby do 999 z dwoma cyframi po przecinku zastosujemy:
models.DecimalField(..., max_digits=5, decimal_places=2)
ImageField - pole takie jak FileField z tym że sprawdza czy plik jest grafiką. Posiada dwa
opcjonalne argument - height_field i width_field, które jeżeli użyte będą przechowywały bieżące rozmiary grafiki. Wymaga Python Imaging Library.
IntegerField - Pole na liczby całkowite.
IPAddressField - Pole na adres IP.
NullBooleanField - Podobne do BooleanField lecz zezwala również na wartość "NULL". W Panelu Admina widoczne jako lista z opcjami "Tak", "Nie", "Nie wiadomo".
PhoneNumberField - Pole CharField sprawdzające poprawność podanej wartości jako numeru telefonu w USA - "XXX-XXX-XXXX".
PositiveIntegerField - Pole na dodatnie liczby całkowite.
PositiveSmallIntegerField - Jak powyższe z tym że ogranicza wartości zgodnie z ograniczeniami danej bazy danych.
SlugField - Pole stosowane jako etykieta czegoś (stosowanie na stronach z nowościami itd.) Zawierać może tylko liczby, litery i podkreślenia. Posiada opcjonalny parametr max_length określający długość (domyślnie 50). Zazwyczaj stosuje się to w linkach.
SmallIntegerField - Tak jak IntegerField lecz z ograniczeniem wartości takim jak dla danej bazy danych.
TextField - Pole na tekst. Reprezentowane w panelu admina przez textarea.
TimeField - Pole przechowujące czas.
URLField - Pole na adres URL. Django automatycznie sprawdza czy URL jest poprawny (tj. strona istnieje i nie zwraca błędu 404). By to wyłączyć należy podać parametr verify_exists=False.
USStateField - Dwuliterowy skrót stanu USA.
XMLField - Pole na dane w formacie XML. Wymaga parametru schema_path zawierającego ścieżkę do schematu RelaxNG, względem którego będzie sprawdzana poprawność.
models.Model (obiekt QUERYSET)
każdy=Person.objects.all()
jan_nowak=Person.objects.filter(nazwisko=‘Nowak’, imie=‘Jan’)
jan_nowak=Person.objects.filter(nazwisko=‘Nowak’).filter(imie=‘Jan’) jan_nienowak=Person.objects.filter(nazwisko=‘Nowak’).exclude(imie=‘
Jan’)
starszy=Person.objects.filter(dataur__lt=datetime.date(2000, 7, 14)) uporzad=Person.objects.all().order_by(‘nazwisko’)
uporzad=Person.objects.all().order_by(‘nazwisko’)[:5]
uporzad=Person.objects.all().order_by(‘nazwisko’,’imie’)
Metody QUERYSET
distinct – zwraca różne rekordy values- słownik pole:wartość
values_list-lista krotek wartość
select_related – automatycznie łączy powiązane ze soba obiekty extra …
models.Model (obiekt QUERYSET)
Person.objects.filter(nazwisko_filtr=‘Nowak’) Filtry:
gt - > gte - >= lt - < lte - <=
in – w np. Person.objects.filter(id__in=[3,15,27]) startswidth – zaczynający się od
istartswidth - zaczynający się od bez względu na wielkość liter contains - zawiera
icontains – zawiera bez względu na wielkość liter endswidth – kończy się na
iendswidth – kończy się na bez względu na wielkość liter range – wartość z przedziału, np.:
Person.objects.filter(pub_date__range=[start_date, end_date]) year – rok (dla pól zawierających datę)
month, day – jw. miesiąc, dzień
models.Model (klasa Q)
from django.db.models import Q
Operatory: & | ~ / i lub nie / and_ or_ not_
jan_marysia=Person.objects.filter(Q(imie=‘Jan’) | Q(imie=‘Marysia’))
1.
t=[‘Jan’, ‘Józef’, ‘Jacek’, Julian’]
pyt=Q() for e in t:
pyt=pyt | Q(imie=e) 2.
pyt=reduce(or_, [Q(e) for e in [‘Jan’, ‘Józef’, ‘Jacek’, Julian’]])
models.Model (metoda extra QUERYSET)
Parametry
select – modyfikuje fragmenty zapytań SELECT where – udostępnia dodatkowe klauzule WHERE tables – udostępnia dodatkowe tabele
params – bezpiecznie zamienia dynamiczne parametry
SELECT first, last, age (age>18) AS is_adult FROM myapp_person;
res=Person.objects.all().extra(select={‘is_adult’:’age > 18’})
SELECT first, last (first||last) AS username FROM myapp_person WHERE first||last ILIKE ‘jeffreyf%’;
res=Person.objects.all().extra(select={‘username’:’first||last’}, where=[„first||last ILIKE ‘jeffreyf%’”])
res=Person.objects.all().extra(select={‘username’:’first||last’},
where=[‘first’=‘%s’], params=[proc()])
models.Model Klucze obce i relacje
Klucze główne:
name=models.CharField(max_length=100, primary_key=True, Unique=True) Przy braku klucza głównego Django zakłada pole o nazwie id.
Klucze obce:
class Author(models.Model):
name=models.CharField(max_length=100) class Book(models.Model):
title=models.CharField(max_length=100) author=models.ForeignKey(Author)
Inne możliwości:
author=models.ForeignKey(‘Author’)
author=models.ForeignKey(‘osoba.prog.models.Author’) author=models.ForeignKey(self)
Wykorzystanie:
1.
book=Book.objects.get(title=‘Kubus Puchatek’) # Weź książkę
a=book.author # Pobierz autorów książek
books=a.book_set.all() # weź wszystkie książki danego autora 2. # Milne’go
author=models.ForeignKey(‘Author’, related_name=‘books’) books=author.books.all()
3. a=Book.objects.get(id=50) b=Author.objects.get(name=‘Prus’)
a.author b.book_set.all()
a.author.name b.book_set.filter(title_icontains=‘lalka’) .title
models.Model Relacje M-M 1-1
Relacje M-M (symetryczne, w dowolnej klasie):
class Author(models.Model):
name=models.CharField(max_length=100) class Book(models.Model):
title=models.CharField(max_length=100)
author=models.ManyToMany(Author)Wykorzystanie:
bk=Book.objects.get(title=‘Kubus Puchatek’) # Weź książkę
authors=bk.author_set.all() # Pobierz autorów wszystkich książek books=authors[2].book_set_all() # weź wszystkie książki 3 autora lub
author=models.ForeignKey(‘Author’, related_name=‘books’) books=author.books.all()
Django - Formularze
Biblioteka forms - składa się z 3 komponentów:
Widget - klasa odpowiadająca za kod HTML.
Field - klasa odpowiedzialna za walidację, np. pole EmailField sprawdza czy podana wartość jest poprawnym adresem email.
Form - zbiór pól, które wiedzą jak się walidować i jak się wyświetlać jak HTML.
f = TestForm() print f
def testform(request):
f = TestForm()
return render_to_response('content/test.html', {'f1': f, 'f2': f.as_ul(), 'f3': f.as_p()})
Kod szablonu:
<table> {{ f1 }} </table> <br />
<hr />
<br />
<ul> {{ f2 }} </ul>
<br />
<hr />
<br /> {{ f3 }}
Django – Pola Formularzy
Każde pole formularza pożna konfigurować za pomocą parametrów:
required - domyślnie True, oznacza iż pole jest wymagane
label - możemy podać etykietę pola, czyli tekst jaki pojawi się obok pola initial - pozwala określić początkową wartość
widget - pozwala określić widget jaki ma zostać użyty do wyświetlenie pola help_text - dodatkowy tekst pomocy
Dostępnych jest szereg typów pól:
BooleanField - Pole checkbox na wartości True/False
CharField - pole text, dodatkowe argument to max_length i min_length określające maksymalną i minimalną długość wprowadzonego tekstu
ChoiceField - pole select przyjmujące argument choices - listę lub tuplę złożoną z 2 elementowych tupli.
DateField - pole text walidowane jako data. Argument input_formats umożliwia określenie dopuszczalnych formatów, np.: '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' ‘
DateTimeField - pole text walidowane jako data i czas, np.:
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59‘
'%Y-%m-%d', # '2006-10-25' '%m/%d/%Y', # '10/25/2006‘
'%m/%d/%y %H:%M', # '10/25/06 14:30’
DecimalField - pole text na liczby zmiennoprzecinkowe. Dodatkowe parametry to max_value, min_value, max_digits (maks. ilość cyfr) i decimal_places (ilość miejsc po przecinku)
EmailField - pole text na ares email FileField - pole file na dowolny plik
ImageField - pole file na plik graficzny, wymaga PIL
IntegerField - pole text na liczby całkowite, dodatkowe argumenty: max_value i min_value
MultipleChoiceField - podobne do ChoiceField, lecz umożliwia wybór wielu opcji. Przyjmuje parametr choices.
TimeField - pole na czas, domyślnie akceptuje formaty: '%H:%M:%S', # '14:30:59' '%H:%M', # '14:30' URLField - pole na odnośnik URL.
Django – walidacja formularzy
is_valid() - zwraca True/False, zwraca słownik errors() - opis błędów lub
cleaned_data – słownik "znormalizowanych" danych ale nigdy oba!!
def test_view(request):
a = TestForm({'subject':'temat', 'message':'wiadomość', 'sender': '1@1.pl'}) print a.is_valid()
print a.cleaned_data
return render_to_response('test.html', {'a':a}, context_instance=RequestContext(request))
By uzyskać dostęp do samych pól formularza wystarczy odwoływać się do pól stosując składnię słownika i nazwy pól jako klucze, np:
def test_view(request):
a = TestForm({'subject':'temat', 'message':'wiadomość', 'sender': '1@1.pl'}) print a['sender']
return render_to_response('test.html', {'a':a},
context_instance=RequestContext(request))
Django – widoki generyczne - przykład
from django.views.generic import lis_detail urlpatterns=patterns(‘’,
(r^strona/$’, list_detail.object_list, {‘queryset’:Person.objects.all(), template_name’:’osob_list.html’,
template_object_name’: ‘ persona’}) {% block content %}
<h2>Osoby </h2>
<ul>
{% for e in object_list %}
<li> {{e}} </li>
{% endfor %}
</ul>
{% endblock %}
Django – widoki generyczne
Proste widoki
django.views.generic.simple.direct_to_template
django.views.generic.simple.redirect_to Widoki bazujące na dacie
django.views.generic.date_based.archive_index
django.views.generic.date_based.archive_year
django.views.generic.date_based.archive_month
django.views.generic.date_based.archive_week
django.views.generic.date_based.archive_day
django.views.generic.date_based.archive_today
django.views.generic.date_based.object_detail Widoki Listuj/Pokaż
django.views.generic.list_detail.object_list
django.views.generic.list_detail.object_detail Widoki stwórz/edytuj/kasuj
django.views.generic.create_update.create_object
django.views.generic.create_update.update_object