Laboratorium 2. def detail(request, question_id): return HttpResponse("Patrzysz na pytanie %s." % question_id)

Podobne dokumenty
Kurs rozszerzony języka Python

Chatter Aplikacja internetowa

Serwer WWW na przykªadzie Django

Laboratorium Kierunki Rozwoju oprogramowania REST, Django

Kurs rozszerzony języka Python

Zaawansowany kurs języka Python

Kurs rozszerzony języka Python

Quiz Aplikacja internetowa

Serwer WWW na przykªadzie Django cz.3

Szkielety tworzenia aplikacji. Dr inż. Andrzej Grosser

Serwer WWW na przykªadzie Django cz.1

Aplikacje WWW. Krzysztof Ciebiera. 3 kwietnia 2014

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Dokumentacja. Realizacja w portalu kalkulatora simple. (dane wprowadzane z klawiatury).

MVC w praktyce tworzymy system artykułów. cz. 2

Lista ToDo Aplikacja internetowa

NoSQL Not Only SQL: CouchDB. I.Wojnicki, NoSQL. Apache CouchDB has started. Time to relax. Przetwarzanie dokumentów i widoków.

Testy aplikacji webowych

Wprowadzenie do Internetu Zajęcia 5

Aplikacje internetowe i rozproszone - laboratorium

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Laboratorium 7 Blog: dodawanie i edycja wpisów

Django. Æwiczenia praktyczne

petycja-norweskie Documentation

Wzorce prezentacji internetowych

Laboratorium 1 Wprowadzenie do PHP

Przykład programu w PHP. Wykład10.PHP ciągdalszy,str.1

Szablony. Szablony funkcji

Java Server Faces narzędzie do implementacji w wy prezentacji

Architektury Usług Internetowych. Laboratorium 1. Servlety

Technologie internetowe ASP.NET Core. Paweł Rajba

Jak okiełznać frontend w Django? Piotr Maliński

Realizacja Aplikacji Internetowych 2013 laboratorium cz. 2 K.M. Ocetkiewicz

app/ - folder zawiera pliki konfiguracyjne dla całej aplikacji src/ - folder zawiera cały kod PHP aplikacji

MVC w praktyce tworzymy system artykułów. cz. 1

Architektura MVC w ASP.NET. Autor wykładu: Marek Wojciechowski

Szkielety tworzenia aplikacji

Bezpieczeństwo frameworków WEBowych Java na przykładzie ataku CSRF

Modele. Najcz. Metoda unicode definiuje sposób wyświetlania obiektu w postaci tekstowej. BooleanField - pole logiczne, True/False

Język PHP. Studium Podyplomowe Sieci Komputerowe i Aplikacje Internetowe. v1.7, 2007/11/23

Aplikacje WWW - laboratorium

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Zaawansowany kurs języka Python

Podstawy wzorca MVC MODEL KON- TROLER WIDOK. Odpowiada za wyświetlenie danych użytkownikowi. Zawiera dane aplikacji oraz jej logikę.

Obiektowe bazy danych


SMS Kod Automatyczny

Zaawansowane aplikacje internetowe

Kurs języka Python. Wykład 14. Marcin Młotkowski. 25 stycznia Python i Apache Pythonowe platformy aplikacyjne. Dystrybucja aplikacji w U*IX

Zaawansowane bazy danych i hurtownie danych studia zaoczne II stopnia, sem. I

Formularze w PHP dla początkujących

NoSQL Not Only SQL, CouchDB. I.Wojnicki, NoSQL. Apache CouchDB has started. Time to relax. Igor Wojnicki

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

TDD w Django South Sorl Haystack + Whoosh Małe, a cieszy Deployment Koniec. Wspomagacze Django. Jan Filipowski. 25 maja 2010

Niebezpieczna Kryptografia - zadania kwalifikacyjne

Udostępnianie klientom zasobów serwera

Szkielety tworzenia aplikacji

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

BRAMKA HTTP SMS XML Dokumentacja techniczna. wersja 3.32

prepared by: Programowanie WWW Model-View-Controller

Zaawansowany kurs języka Python

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Scenariusz Web Design DHTML na 10 sesji. - Strony statyczne I dynamiczne. - Dodawanie kodu VBScript do strony HTML. Rysunek nie jest potrzebny

Laboratorium 10 - Web Services

Zaawansowane aplikacje internetowe laboratorium

Kurs języka Ruby. Ruby on Rails ActionPack

Programowanie wielowarstwowe i komponentowe

Aplikacje WWW - laboratorium

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Michał Bielecki, KNI 'BIOS'

ZAAWANSOWANE BAZY DANYCH I HURTOWNIE DANYCH MySQL, PHP

Przewodnik krok po kroku:

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Dokumentacja Skryptu Mapy ver.1.1

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

app/ - folder zawiera pliki konfiguracyjne dla całej aplikacji Można wybrać sposób zapisu konfiguracji: YML, XML, PHP

Przewodnik Szybki start

Dzi kuj za uwag! Spotkania z Pythonem. Cz ± 1 - podstawy - rozwi zania zada« Michaª Alichniewicz. Gda«sk Studenckie Koªo Automatyków SKALP

Udostępnianie klientom zasobów serwera

Czysta architektura (nawet z Django!) Sebas an PyWaw 72

Przykładowa integracja systemu tpay.com KIP S.A. ul. Św. Marcin 73/ Poznań.

Tworzenie i wykorzystanie usług

Zajęcia 4 - Wprowadzenie do Javascript

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Aplikacje WWW - laboratorium

Aplikacje WWW - lab 5

Wątki i komunikacja między nimi w języku Python

C++ Przeładowanie operatorów i wzorce w klasach

FORMULARZE Formularz ma formę ankiety, którą można wypełnić na stronie. Taki formularz może być np. przesłany pocztą elektroniczną .

Metody Metody, parametry, zwracanie wartości

Internetowe bazy danych

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Zarządzanie projektem informatycznym laboratorium

Systemy internetowe. Wykład 3 PHP. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Transkrypt:

Laboratorium 2 1. Tworzenie widoków dla użytkownika. nazwa_aplikacji/views.py def detail(request, question_id): return HttpResponse("Patrzysz na pytanie %s." % question_id) def results(request, question_id): response = "Patrzysz na wyniki pytania %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("Oddałeś głos na pytanie %s." % question_id) nazwa_aplikacji/urls.py from django.conf.urls import url from. import views urlpatterns = [ # ex: /nazwa_aplikacji/ url(r'^$', views.index, name='index'), # ex: /nazwa_aplikacji/5/ url(r'^(?p<question_id>[0-9]+)/$', views.detail, name='detail'), # ex: /nazwa_aplikacji/5/results/ url(r'^(?p<question_id>[0-9]+)/results/$', views.results, name='results'), ] # ex: /nazwa_aplikacji/5/vote/ url(r'^(?p<question_id>[0-9]+)/vote/$', views.vote, name='vote'), uruchomienie ponownie serwera 2. Pisanie widoku, który już coś wykonuje - wyświetlenie listy 5 pytań oddzielonych przecinkami, według daty publikacji. nazwa_aplikacji/views.py from django.http import HttpResponse def index(request):

latest_question_list = Question.objects.order_by('- pub_date')[:5] output = ', '.join([q.question_text for q in latest_question_list]) return HttpResponse(output) - pozostałe widoki pozostają bez zmian; nazwa_aplikacji/templates/nazwa_aplikacji/index.html {% if latest_question_list %} <ul> {% for question in latest_question_list %} <li><a href="/nazwa_aplikacji/{{ question.id }}/">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>brak dostępnych ankiet.</p> {% endif %} modyfikacja widoku nazwa_aplikacji/views.py from django.http import HttpResponse from django.template import loader def index(request): latest_question_list = Question.objects.order_by('- pub_date')[:5] template = loader.get_template('nazwa_aplikacji/index.html') context = { } 'latest_question_list': latest_question_list, return HttpResponse(template.render(context, request)) - uruchomienie ponownie serwera

wykorzystanie funkcji render() from django.shortcuts import render def index(request): latest_question_list = Question.objects.order_by('- pub_date')[:5] context = {'latest_question_list': latest_question_list} return render(request, 'nazwa_aplikacji/index.html', context) 3. Tworzenie wyjątku: błąd Http404 nazwa_aplikacji/views.py from django.http import Http404 from django.shortcuts import render def detail(request, question_id): try: question = Question.objects.get(pk=question_id) except Question.DoesNotExist: raise Http404("Pytanie nie istnieje") return render(request, 'nazwa_aplikacji/detail.html', {'question': question}) nazwa_aplikacji/templates/nazwa_aplikacji/detail.html {{ question }} 4. Tworzenie wyjątku za pomocą funkcji: get_object_or_404() nazwa_aplikacji/views.py from django.shortcuts import get_object_or_404, render def detail(request, question_id):

question = get_object_or_404(question, pk=question_id) return render(request, 'nazwa_aplikacji/detail.html', {'question': question}) nazwa_aplikacji/templates/nazwa_aplikacji/detail.html <h1>{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li>{{ choice.choice_text }}</li> {% endfor %} </ul> 5. Przestrzeń nazw URL: Co gdy projekt zawiera więcej pytań? Jak Django odróżnienia nazwy URL? Na przykład, aplikacja nazwa_aplikacji zawiera detalis widok. W jaki sposób można zrobić to tak, że Django wie, który widok do tworzenia aplikacji dla URL przy użyciu {% url%} szablon? Odpowiedźią jest dodanie przestrzeni nazw do URLconf. W nazwa_aplikacji/urls.py należy dodać: from django.conf.urls import url from. import views app_name = 'nazwa_aplikacji' urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^(?p<question_id>[0-9]+)/$', views.detail, name='detail'), url(r'^(?p<question_id>[0-9]+)/results/$', views.results, name='results'), url(r'^(?p<question_id>[0-9]+)/vote/$', views.vote, name='vote'), nazwa_aplikacji/templates/nazwa_aplikacji/index.html <li><a href="{% url 'nazwa_aplikacji:detail' question.id %}">{{ question.question_text }}</a></li> 6. Tworzenie formularza nazwa_aplikacji/templates/nazwa_aplikacji/detail.html

<h1>{{ question.question_text }}</h1> {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} <form action="{% url 'nazwa_aplikacji:vote' question.id %}" method="post"> {% csrf_token %} {% for choice in question.choice_set.all %} <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" /> <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br /> {% endfor %} <input type="submit" value="vote" /> </form> nazwa_aplikacji/urls.py url(r'^(?p<question_id>[0-9]+)/vote/$', views.vote, name='vote'), nazwa_aplikacji/views.py dodawanie obsługi formularza from django.shortcuts import get_object_or_404, render from django.http import HttpResponseRedirect, HttpResponse from django.urls import reverse from.models import Choice, Question def vote(request, question_id): question = get_object_or_404(question, pk=question_id) try: selected_choice = question.choice_set.get(pk=request.post['choice']) except (KeyError, Choice.DoesNotExist): return render(request, 'nazwa_aplikacji/detail.html', { 'question': question, 'error_message': "Nie dokonano wyboru.",

}) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('nazwa_aplikacji:results', args=(question.id,))) 7. Po oddaniu głosu vote() następuje przekierowanie do strony z wynikami ankiety nazwa_aplikacji/views.py from django.shortcuts import get_object_or_404, render def results(request, question_id): question = get_object_or_404(question, pk=question_id) return render(request, 'nazwa_aplikacji/results.html', {'question': question}) nazwa_aplikacji/templates/nazwa_aplikacji/results.html <h1>{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes pluralize }}</li> {% endfor %} </ul> <a href="{% url 'nazwa_aplikacji:detail' question.id %}">Vote again?</a> 8. Tworzenie widoku generycznego Tworzenie aplikacji internetowych wymaga często stosowania tych samych metod postępowania (wzorców postępowania) dla różnych danych. Często wymagałoby to wielokrotnego implementowania praktycznie tych samych elementów. Stąd też pojawiły się widoki generyczne dla najczęściej stosowanych widoków. Do realizacji postawionych celów użyjemy widoków generycznych opartych na klasach (wprowadzonych w Django 1.3). nazwa_aplikacji/urls.py

from django.conf.urls import url from. import views app_name = 'nazwa_aplikacji' urlpatterns = [ url(r'^$', views.indexview.as_view(), name='index'), url(r'^(?p<pk>[0-9]+)/$', views.detailview.as_view(), name='detail'), url(r'^(?p<pk>[0-9]+)/results/$', views.resultsview.as_view(), name='results'), url(r'^(?p<question_id>[0-9]+)/vote/$', views.vote, name='vote'), ] nazwa_aplikacji/views.py from django.shortcuts import get_object_or_404, render from django.http import HttpResponseRedirect from django.urls import reverse from django.views import generic from.models import Choice, Question class IndexView(generic.ListView): template_name = 'nazwa_aplikacji/index.html' context_object_name = 'latest_question_list' def get_queryset(self): """Zwraca ostanie pięć pytań.""" return Question.objects.order_by('-pub_date')[:5] class DetailView(generic.DetailView): model = Question template_name = 'nazwa_aplikacji/detail.html'

class ResultsView(generic.DetailView): model = Question template_name = 'nazwa_aplikacji/results.html' def vote(request, question_id): # reszta pozostaje bez zmian.