• Nie Znaleziono Wyników

Wykład 7: Django - szerzej

N/A
N/A
Protected

Academic year: 2021

Share "Wykład 7: Django - szerzej"

Copied!
26
0
0

Pełen tekst

(1)

Wykład 7: Django - szerzej

Andrzej Krajka

(2)

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.

(3)

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" />

(4)

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

(5)

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

(6)

Adresy URL

 Wyrażenia regularne – moduł re

(7)

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’),

)

(8)

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

(9)

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

(10)

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

(11)

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.

(12)

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

(13)

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()

(14)

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)

(15)

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ść.

(16)

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=‘J

an’)

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 …

(17)

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ń

(18)

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’]])

(19)

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()])

(20)

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

(21)

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()

(22)

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 }}

(23)

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.

(24)

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))

(25)

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 %}

(26)

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

django.views.generic.create_update.delete_object

Cytaty

Powiązane dokumenty

Trudniej jest porównać dwa ułamki zwykłe od dwóch liczb naturalnych, na które wystarczy, że zerkniemy okiem, a już potrafimy wskazać większą z nich.. W przypadku dwóch

A więc chcemy mówić, że zdecydowanie „jest gorąco” gdy temperatura jest większa niż 100stopni, zdecydowanie nie jest gorąco gdy temperatura jest mniejsza niż

Szuler jest gotów grać z nami wiele razy o dowolne stawki, które jesteśmy w stanie założyć.. Udowodnić, że niezależnie od wyboru strategii nasze szanse na uzyskanie

Pole magnetyczne można opisać przy pomocy wektora indukcji magnetycznej B.. W przeciwieństwie do pola elektrycznego, pole magnetyczne

Część ViewModel jest tutaj odpowiedzialna za udostępnianie danych z modelu do widoku w.

 XMLHttpRequest - klasa umożliwiająca asynchroniczne przesyłanie danych; dzięki asynchroniczności w trakcie pobierania danych użytkownik może wykonywać inne czynności,

W dowolnym n-wyrazowym postępie arytmetycznym o sumie wyrazów równej n, k-ty wyraz jest równy 1.. Dla podanego n wskazać takie k, aby powyższe zdanie

Projekt jest to przedsięwzięcie, na które składa się zespół czynności, które charakteryzują się tym, że mają:.. 