Programowanie Komponentowe: #8 Django II
-
Upload
mikolaj-olszewski -
Category
Documents
-
view
95 -
download
0
description
Transcript of Programowanie Komponentowe: #8 Django II
-
#8: Django IIMikoaj Olszewski
Jakie pytania po lekturze?
In [1]: from django.conf import settingssettings.configure()
FormularzePodstawa interaktywnych stron
Googlekomentarzeamerykaska wiza
Pozyskanie danych od uytkownikaPrzetwarzanie
walidacjaskadowaniedecyzja przekierowanie
Komunikat
Formularz kontaktowycontact/templates/contact/form.html
{% if errors %}
-
{% for error in errors %} {{ error }} {% endfor %} {% endif %} {% csrf_token %} Temat: Adres e-mail (opcjonalny): Wiadomo: {{ message }}
Widok dla formularza kontaktowegocontact/views.py
In [2]: def contact(request): errors = [] if request.method == 'POST': subject = request.POST.get('subject', '') if not subject: errors.append('Wprowad temat.') message = request.POST.get('message', '') if not message: errors.append('Wprowad wiadomo.') email = request.POST.get('email') if email and '@' not in request.POST['email']: errors.append('Wprowad prawidowy adres e-mail.') if not errors: send_mail( request.POST['subject'], request.POST['message'], request.POST.get('email', '[email protected]'), ['[email protected]'], ) return HttpResponseRedirect('/contact/thanks/') return render_to_response('contact/form.html', locals())
Formularze Django
-
django.formsWidety HTMLPola z walidacjFormularz jako kolekcja plRenderowanie formularzaWasna walidacja
Formularz kontaktowy inaczejcontact/forms.pycontact/templates/contact/form.htmlcontact/views.py
In [3]: def contact(request): if request.method == 'POST': # formularz zosta przesany form = ContactForm(request.POST) # powizanie formularza z przesanymi danymi if form.is_valid(): # pomylna walidacja # przetworzenie danych w form.cleaned_data # ... return HttpResponseRedirect('/contact/thanks/') # przekierowanie !!! else: form = ContactForm(initial={ 'subject': u'Ta strona jest wietna!' }) # nowy formularz return render_to_response('contact/form.html', locals())
Ulepszanie wyglduul.errorlistElementy formularza
{{ form.fieldname }}{{ form.fieldname.errors }}{{ form.fieldname.label }}{{ form.fieldname.value }}...
Podglddjango.contrib.formtools do settings.INSTALLED_APPScontact/urls.pycontact/views.py
-
Formularze dla modelidjango.forms.ModelFormKonwersja plblank=True required=Falseverbose_name labelsave()polls/forms.pypolls/urls.pypolls/templates/polls/form.html
Panel administracyjnyKiller feature automatyczny CRUDRegua pareto: 80/20Aplikacja Django
Uruchomieniedjango.contrib.admin w settings.INSTALLED_APPS./manage.py syncdburls.pyhttp://localhost:8000/admin
Rejestracja aplikacji w panelupolls/admin.py
Dostrajanie narzdziaadmin.site.register(Model, ModelAdmin)Pola i filtry dla listy w polls/admin.pyInlineModelAdmin w polls/admin.pyUszczegowienie pl w polls/models.py
Autentykacja i Autoryzacja
Ciasteczka
-
In [4]: def show_color(request): if "color" in request.COOKIES: return HttpResponse("Twj kolor to %s" % request.COOKIES["color"]) else: return HttpResponse("Nie wybrae swojego koloru.")
def set_color(request): if "color" in request.GET: response = HttpResponse("Wybrae kolor %s" % request.GET["color"]) response.set_cookie("color", request.GET["color"]) return response else: return HttpResponse("Nie podae koloru.")
max_age, expirespath, domainsecure
Sesjadjango.contrib.sessions.middleware.SessionMiddlewaredjango.contrib.sessions
In [5]: def show_color(request): if "color" in request.session: return HttpResponse("Twj kolor to %s" % request.session["color"]) else: return HttpResponse("Nie wybrae swojego koloru.")
def set_color(request): if "color" in request.GET: response = HttpResponse("Wybrae kolor %s" % request.GET["color"]) request.session["color"] = request.GET["color"] return response else: return HttpResponse("Nie podae koloru.")
Konguracja sesjitestowe ciasteczko
-
request.session.set_test_cookie()request.session.test_cookie_worked()request.session.delete_test_cookie()
SESSION_SAVE_EVERY_REQUESTSESSION_EXPIRE_AT_BROWSER_CLOSESESSION_COOKIE_AGESESSION_COOKIE_DOMAINSESSION_COOKIE_NAMESESSION_COOKIE_SECURE
Django A/AModele
uytkownicy (User)grupy (Group)uprawnienia (Permission)wiadomoci (Message)
Sesje uytkownika (oparte o ciasteczka)django.contrib.authdjango.contrib.auth.middleware.AuthenticationMiddleware
Uytkownikrequest.userPola
username, first_name, last_name, email, passwordis_staff, is_superuser, last_login, date_jonedgroups, permissions
Metodyis_authenticated(), is_anonymous()get_full_name()set_password(passwd), check_password(passwd)get_group_permissions(), get_all_permissions()has_perm(perm), has_perms(perm_list), has_module_perms(app_label)get_and_delete_messages(), email_user(subj, msg)
Logowanie i wylogowanie
In [6]: from django.contrib import auth
def login(request): username = request.POST.get('username', '') password = request.POST.get('password', '')
-
user = auth.authenticate(username=username, password=password) if user is not None and user.is_active: auth.login(request, user) return HttpResponseRedirect("/account/loggedin/") else: return HttpResponseRedirect("/account/invalid/")
def logout(request): auth.logout(request) return HttpResponseRedirect("/account/loggedout/")
Domylne widokilogin, logout, logout_then_loginpassword_change, password_change_donepassword_reset, password_reset_done, password_reset_confirm, password_reset_complete
In [7]: from django.conf.urls import patternsfrom django.contrib.auth.views import login, logout
urlpatterns = patterns('account.views', (r'^login/$', login), (r'^logout/$', logout),)
Ograniczanie dostpu
In [8]: def my_view(request): if not request.user.is_authenticated(): return HttpResponseRedirect('/accounts/login/?next=%s' % request.path) # ...
Dekorator
In [9]: from django.contrib.auth.decorators import login_required
@login_requireddef my_view(request): # ... pass
-
Ograniczanie na podstawie uprawnie
In [10]: def my_view(request): if not request.user.has_perm('news.can_vote'): return HttpResponse("Nie moesz gosowa") # ...
Dekoratory
In [11]: from django.contrib.auth.decorators import user_passes_test
@user_passes_test(lambda u: u.has_perm('news.can_vote'))def my_view(request): # ... pass
In [12]: from django.contrib.auth.decorators import permission_required
@permission_required('news.can_vote')def my_view(request): # ... pass
Rejestracja
In [13]: from django.contrib.auth.forms import UserCreationForm
def register(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): new_user = form.save() return HttpResponseRedirect("/") else: form = UserCreationForm() context = { 'form': form, } return render_to_response("accounts/register.html", context)
UprawnieniaDomylne
-
django.contrib.authDla kadego modelu
add (np. polls.add_poll)change (np. polls.change_poll)delete (np. polls.delete_poll)
Wasnefrom django.db import models
class Poll(models.Model): ...
class Meta: permissions = (("can_vote", "Moe gosowa"), )
PodsumowaniePrzetwarzanie danych
pobieraniewalidacjazapisanie
Duo wicej moliwocizbiory formularzyformularze wieloczciowedoczane media
Panel administracyjnyoperacje CRUDwspdziaanie z formularzamielastycznoakcjefiltrywyszukiwanie
Wicej moliwocinadpisywanie szablonwwiele paneligenerator dokumentacji
A/Asesjasystem uytkownikw, grup i pozwoledomylne widokiwasna rejestracjaelastyczno
-
#8: Django IIMikoaj OlszewskiJakie pytania po lekturze?
FormularzeFormularz kontaktowyWidok dla formularza kontaktowego
Formularze DjangoFormularz kontaktowy inaczejUlepszanie wyglduPodgld
Formularze dla modeli
Panel administracyjnyUruchomienieRejestracja aplikacji w paneluDostrajanie narzdzia
Autentykacja i AutoryzacjaCiasteczkaSesjaKonfiguracja sesji
Django A/AUytkownikLogowanie i wylogowanieDomylne widoki
Ograniczanie dostpuDekorator
Ograniczanie na podstawie uprawnieDekoratory
RejestracjaUprawnieniaDomylneWasne
Podsumowanie