SlideShare ist ein Scribd-Unternehmen logo
1 von 59
Downloaden Sie, um offline zu lesen
Програмиране с Питон - Django, част 2
(Data) Model        View   Template

Дефинира типовете и
структурата на
данните
(Data) Model             View     Template

Дефинира типовете и Бизнес логика
структурата на
данните
(Data) Model             View          Template

Дефинира типовете и Бизнес логика   Представяне на
структурата на                      данните
данните
class Haiku(models.Model):
    user = models.ForeignKey(User)
    text = models.TextField()
    created = models.DateTimeField(default =
                         datetime.now)
@login_required
def add_haiku(request):
    if request.method == "POST":
        haiku = Haiku(user = request.user,
                      text = request.POST.get('text'))
        haiku.save()

    return redirect('user-page', username = request.user.username)
Generic Views


           DetailView
            ListView


queryset = Haiku.objects.all()
context_object_name = “haiku”
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>За мен:</p>
    <ul>
    {% for fact in facts %}
         <li>{{ title }}</li>
    {% endfor %}
    </ul>
</body>
</html>
Сложни темплейти
Програмиране с Питон - Django, част 2
Програмиране с Питон - Django, част 2
article.html
base.html




article.html
show_article()
show_article()
             article.html

{% extends "base.html" %}

{% block title %}
New York Times: {{article.title}}
{% endblock %}

{% block body %}
<h1>{{article.title}}</h1>
<div class="author">
  By {{article.author.full_name}}
</div>
{{ article.text }}
{% endblock %}
base.html
                                    <!DOCTYPE html>
   show_article()                   <html>
                                    <head>
                                          <title>
             article.html                  {% block title %}
                                           New York Times
{% extends "base.html" %}                  {% endblock %}
                                          </title>
{% block title %}                   </head>
New York Times: {{article.title}}   <body>
{% endblock %}                            <header>
                                          ...
{% block body %}                          </header>
<h1>{{article.title}}</h1>                <section>
<div class="author">                      {% block body %}
  By {{article.author.full_name}}         {% endblock %}
</div>                                    </section>
{{ article.text }}                        <footer>
{% endblock %}                            ...
                                          </footer>
                                    </body>
                                    </html>
base.html
                                    <!DOCTYPE html>
   show_article()                   <html>
                                    <head>
                                          <title>
             article.html                  {% block title %}
                                           New York Times
{% extends "base.html" %}                  {% endblock %}
                                          </title>
{% block title %}                   </head>
New York Times: {{article.title}}   <body>
{% endblock %}                            <header>
                                          ...
{% block body %}                          </header>
<h1>{{article.title}}</h1>                <section>
<div class="author">                      {% block body %}
  By {{article.author.full_name}}         {% endblock %}
</div>                                    </section>
{{ article.text }}                        <footer>
{% endblock %}                            ...
                                          </footer>
                                    </body>
                                    </html>
{{ article.date|date }} # May 26, 2011
{{ article.date|timesince }} # 3 days ago
{{ article.title|lower }} # bear urinates on mayor
{{ aritcle.html|safe }} # My article
&lt;abbr&gt;HTML&lt;/abbr&gt;

Още: http://docs.djangoproject.com/en/dev/ref/templates/builtins/
Можем да си пишем сами: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/
Програмиране с Питон - Django, част 2
Програмиране с Питон - Django, част 2
Client/Server


                           Web
                         Browser
          HT ML

Django
Server
Client/Server


                           Web
                         Browser
          HT ML

Django    JSON
                         JavaScript
Server
Client/Server


                           Web
                         Browser
          HT ML

Django    JSON
                         JavaScript
Server
          JSO
                N
                         Desktop
                          App
Client/Server


                                       Web
                                     Browser
                      HT ML

   Django             JSON
                                     JavaScript
   Server
                      JSO
                            N
                                     Desktop
                                      App
Twitter: HTML JSON
JSON

{
    first_name: 'John',
    last_name: 'Smith',
    friends: [
        { name: 'Jane Smith', id: 123},
        { name: 'Ivana Trump', id: 444},
    ],
}


import json
json_text = json.dumps(my_object)
my_object_2 = json.loads(json_text)
class User(models.Model):
    username = models.CharField(max_length=30, unique=True)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    email = models.EmailField(blank=True)
    password = models.CharField(max_length=128)
    is_superuser = models.BooleanField(default=False)
    date_joined = models.DateTimeField(
                      default=datetime.datetime.now)
Нагодяване на вградени модели
Нагодяване на вградени модели




• Monkey patching?
Нагодяване на вградени модели




• Monkey patching?
• Пренаписваме си ги?
Нагодяване на вградени модели




• Monkey patching?
• Пренаписваме си ги?
• Втори модел!
from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User)
    birthdate = models.DateField(blank = True, null = True)
    nickname = models.CharField(max_length = 255,
                    blank = True, null = True)
    photo = models.ImageField(blank = True, null = True)
    phone_number = models.CharField(max_length = 255,
                    blank = True, null = True))


в settings.py добавяме:
AUTH_PROFILE_MODULE = 'my_app.Profile'

начин на употреба:
user = User.objects.get(username = 'jorko4')
profile = user.get_profile()
print(profile.nickname)


* наследяване от типа class Profile(User) би дало същия резултат
Промени по модела след syncdb?
Промени по модела след syncdb?




• Бъркаме в базата данни?
Промени по модела след syncdb?




• Бъркаме в базата данни?
• Миграции!
Миграции със South
Миграции със South



• Миграция: Python клас, който изпълнява
  промени по структурата на база данни
Миграции със South



• Миграция: Python клас, който изпълнява
  промени по структурата на база данни
• Структурата на базата данни започва от
  нулата и се дефинира чрез поредица от
  миграции
Миграции със South



• Миграция: Python клас, който изпълнява
  промени по структурата на база данни
• Структурата на базата данни започва от
  нулата и се дефинира чрез поредица от
  миграции
• Консенсус
Програмиране с Питон - Django, част 2
class Migration(SchemaMigration):
    def forwards(self, orm):




    def backwards(self, orm):
class Migration(SchemaMigration):
    def forwards(self, orm):
        db.create_table('haikus_haiku', (
            ('id', ...),
            ('user', ...),
            ('text', ...),
            ('created', ...),
        ))

    def backwards(self, orm):
        db.delete_table('haikus_haiku')
Първоначална миграция

$ pip install south

$ python manage.py syncdb

за съществуващи приложения:
$ python manage.py convert_to_south myapp

за нови приложения:
$ python manage.py schememigration myapp --initial

при следващи промени:
$ python manage.py schememigration myapp --auto

изпълняване на миграции:
$ python manage.py migrate
myproject/
  myapp/
	 	 migrations/
	 	 	 0001_initial.py
	 	 	 0002_add_profile_picture.py
	 	 	 0003_....
Тестване на уеб приложения
Тестване на уеб приложения



• Не тествайте очевидни неща
Тестване на уеб приложения



• Не тествайте очевидни неща
• Тестване “от край до край”
Тестване на уеб приложения



• Не тествайте очевидни неща
• Тестване “от край до край”
• HTTP тестове
Тестване на уеб приложения



• Не тествайте очевидни неща
• Тестване “от край до край”
• HTTP тестове
• Работим с тестови данни
Тестване на уеб приложения



• Не тествайте очевидни неща
• Тестване “от край до край”
• HTTP тестове
• Работим с тестови данни
• JS тестове - Selenium и QUnit
# haikus/admin.py
from django.contrib import admin
from haikus.models import Haiku

class HaikuAdmin(admin.ModelAdmin):
    date_hierarchy = 'created'
    list_display = ('user', 'text', 'created')


admin.site.register(Haiku, HaikuAdmin)
Не откривайте топлата вода
Не откривайте топлата вода

•   django-debug-toolbar - за да не пишем print(“test”)
Не откривайте топлата вода

•   django-debug-toolbar - за да не пишем print(“test”)

•   django-registration - регистрация на потребители
Не откривайте топлата вода

•   django-debug-toolbar - за да не пишем print(“test”)

•   django-registration - регистрация на потребители

•   django-profile - редакция на профили
Не откривайте топлата вода

•   django-debug-toolbar - за да не пишем print(“test”)

•   django-registration - регистрация на потребители

•   django-profile - редакция на профили

•   django.contrib.comments - коментари (а ла блог)
Не откривайте топлата вода

•   django-debug-toolbar - за да не пишем print(“test”)

•   django-registration - регистрация на потребители

•   django-profile - редакция на профили

•   django.contrib.comments - коментари (а ла блог)

•   django-extensions - улеснения
Не откривайте топлата вода

•   django-debug-toolbar - за да не пишем print(“test”)

•   django-registration - регистрация на потребители

•   django-profile - редакция на профили

•   django.contrib.comments - коментари (а ла блог)

•   django-extensions - улеснения

•   django-jsonfield - речници в SQL
Не откривайте топлата вода

•   django-debug-toolbar - за да не пишем print(“test”)

•   django-registration - регистрация на потребители

•   django-profile - редакция на профили

•   django.contrib.comments - коментари (а ла блог)

•   django-extensions - улеснения

•   django-jsonfield - речници в SQL

•   sorl-thumbnail - смаляване на картинки
Не откривайте топлата вода

•   django-debug-toolbar - за да не пишем print(“test”)

•   django-registration - регистрация на потребители

•   django-profile - редакция на профили

•   django.contrib.comments - коментари (а ла блог)

•   django-extensions - улеснения

•   django-jsonfield - речници в SQL

•   sorl-thumbnail - смаляване на картинки

•   Още: http://djangopackages.com

Weitere ähnliche Inhalte

Ähnlich wie Програмиране с Питон - Django, част 2

HTML – програмиране и валидиране
HTML – програмиране и валидиранеHTML – програмиране и валидиране
HTML – програмиране и валидиранеEkaterina Mitseva
 
Информационни системи - упражнение № 3
Информационни системи - упражнение № 3Информационни системи - упражнение № 3
Информационни системи - упражнение № 3Tsvetelin Pavlov
 
Информационни системи - упражнение № 2
Информационни системи - упражнение № 2Информационни системи - упражнение № 2
Информационни системи - упражнение № 2Tsvetelin Pavlov
 
Word Press за маниаци
Word Press за маниациWord Press за маниаци
Word Press за маниациKaloyan Tsvetkov
 
Xhtml
XhtmlXhtml
Xhtmlsa6o
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLDAVID Academy
 
AJAX и създаване на богати потребителски интерфейси в браузър
AJAX и създаване на богати потребителски интерфейси в браузърAJAX и създаване на богати потребителски интерфейси в браузър
AJAX и създаване на богати потребителски интерфейси в браузърsvilen.ivanov
 

Ähnlich wie Програмиране с Питон - Django, част 2 (17)

HTML – програмиране и валидиране
HTML – програмиране и валидиранеHTML – програмиране и валидиране
HTML – програмиране и валидиране
 
Информационни системи - упражнение № 3
Информационни системи - упражнение № 3Информационни системи - упражнение № 3
Информационни системи - упражнение № 3
 
Информационни системи - упражнение № 2
Информационни системи - упражнение № 2Информационни системи - упражнение № 2
Информационни системи - упражнение № 2
 
Word Press за маниаци
Word Press за маниациWord Press за маниаци
Word Press за маниаци
 
Новостите в HTML 5
Новостите в HTML 5Новостите в HTML 5
Новостите в HTML 5
 
Xhtml
XhtmlXhtml
Xhtml
 
Html1
Html1Html1
Html1
 
B3 t3 cookies
B3 t3 cookiesB3 t3 cookies
B3 t3 cookies
 
B3 t3 cookies
B3 t3 cookiesB3 t3 cookies
B3 t3 cookies
 
Microdata
MicrodataMicrodata
Microdata
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTML
 
DHTML
DHTMLDHTML
DHTML
 
DHTML
DHTMLDHTML
DHTML
 
AJAX и създаване на богати потребителски интерфейси в браузър
AJAX и създаване на богати потребителски интерфейси в браузърAJAX и създаване на богати потребителски интерфейси в браузър
AJAX и създаване на богати потребителски интерфейси в браузър
 
Bootstrap basics
Bootstrap basicsBootstrap basics
Bootstrap basics
 
JavaScipt and AJAX Programming
JavaScipt and AJAX ProgrammingJavaScipt and AJAX Programming
JavaScipt and AJAX Programming
 
Web Programming with JavaScript and Ajax
Web Programming with JavaScript and AjaxWeb Programming with JavaScript and Ajax
Web Programming with JavaScript and Ajax
 

Програмиране с Питон - Django, част 2

  • 2. (Data) Model View Template Дефинира типовете и структурата на данните
  • 3. (Data) Model View Template Дефинира типовете и Бизнес логика структурата на данните
  • 4. (Data) Model View Template Дефинира типовете и Бизнес логика Представяне на структурата на данните данните
  • 5. class Haiku(models.Model): user = models.ForeignKey(User) text = models.TextField() created = models.DateTimeField(default = datetime.now)
  • 6. @login_required def add_haiku(request): if request.method == "POST": haiku = Haiku(user = request.user, text = request.POST.get('text')) haiku.save() return redirect('user-page', username = request.user.username)
  • 7. Generic Views DetailView ListView queryset = Haiku.objects.all() context_object_name = “haiku”
  • 8. <!DOCTYPE html> <html> <head> <title>{{ title }}</title> </head> <body> <h1>{{ title }}</h1> <p>За мен:</p> <ul> {% for fact in facts %} <li>{{ title }}</li> {% endfor %} </ul> </body> </html>
  • 15. show_article() article.html {% extends "base.html" %} {% block title %} New York Times: {{article.title}} {% endblock %} {% block body %} <h1>{{article.title}}</h1> <div class="author"> By {{article.author.full_name}} </div> {{ article.text }} {% endblock %}
  • 16. base.html <!DOCTYPE html> show_article() <html> <head> <title> article.html {% block title %} New York Times {% extends "base.html" %} {% endblock %} </title> {% block title %} </head> New York Times: {{article.title}} <body> {% endblock %} <header> ... {% block body %} </header> <h1>{{article.title}}</h1> <section> <div class="author"> {% block body %} By {{article.author.full_name}} {% endblock %} </div> </section> {{ article.text }} <footer> {% endblock %} ... </footer> </body> </html>
  • 17. base.html <!DOCTYPE html> show_article() <html> <head> <title> article.html {% block title %} New York Times {% extends "base.html" %} {% endblock %} </title> {% block title %} </head> New York Times: {{article.title}} <body> {% endblock %} <header> ... {% block body %} </header> <h1>{{article.title}}</h1> <section> <div class="author"> {% block body %} By {{article.author.full_name}} {% endblock %} </div> </section> {{ article.text }} <footer> {% endblock %} ... </footer> </body> </html>
  • 18. {{ article.date|date }} # May 26, 2011 {{ article.date|timesince }} # 3 days ago {{ article.title|lower }} # bear urinates on mayor {{ aritcle.html|safe }} # My article &lt;abbr&gt;HTML&lt;/abbr&gt; Още: http://docs.djangoproject.com/en/dev/ref/templates/builtins/ Можем да си пишем сами: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/
  • 21. Client/Server Web Browser HT ML Django Server
  • 22. Client/Server Web Browser HT ML Django JSON JavaScript Server
  • 23. Client/Server Web Browser HT ML Django JSON JavaScript Server JSO N Desktop App
  • 24. Client/Server Web Browser HT ML Django JSON JavaScript Server JSO N Desktop App Twitter: HTML JSON
  • 25. JSON { first_name: 'John', last_name: 'Smith', friends: [ { name: 'Jane Smith', id: 123}, { name: 'Ivana Trump', id: 444}, ], } import json json_text = json.dumps(my_object) my_object_2 = json.loads(json_text)
  • 26. class User(models.Model): username = models.CharField(max_length=30, unique=True) first_name = models.CharField(max_length=30, blank=True) last_name = models.CharField(max_length=30, blank=True) email = models.EmailField(blank=True) password = models.CharField(max_length=128) is_superuser = models.BooleanField(default=False) date_joined = models.DateTimeField( default=datetime.datetime.now)
  • 28. Нагодяване на вградени модели • Monkey patching?
  • 29. Нагодяване на вградени модели • Monkey patching? • Пренаписваме си ги?
  • 30. Нагодяване на вградени модели • Monkey patching? • Пренаписваме си ги? • Втори модел!
  • 31. from django.db import models from django.contrib.auth.models import User class Profile(models.Model): user = models.OneToOneField(User) birthdate = models.DateField(blank = True, null = True) nickname = models.CharField(max_length = 255, blank = True, null = True) photo = models.ImageField(blank = True, null = True) phone_number = models.CharField(max_length = 255, blank = True, null = True)) в settings.py добавяме: AUTH_PROFILE_MODULE = 'my_app.Profile' начин на употреба: user = User.objects.get(username = 'jorko4') profile = user.get_profile() print(profile.nickname) * наследяване от типа class Profile(User) би дало същия резултат
  • 33. Промени по модела след syncdb? • Бъркаме в базата данни?
  • 34. Промени по модела след syncdb? • Бъркаме в базата данни? • Миграции!
  • 36. Миграции със South • Миграция: Python клас, който изпълнява промени по структурата на база данни
  • 37. Миграции със South • Миграция: Python клас, който изпълнява промени по структурата на база данни • Структурата на базата данни започва от нулата и се дефинира чрез поредица от миграции
  • 38. Миграции със South • Миграция: Python клас, който изпълнява промени по структурата на база данни • Структурата на базата данни започва от нулата и се дефинира чрез поредица от миграции • Консенсус
  • 40. class Migration(SchemaMigration): def forwards(self, orm): def backwards(self, orm):
  • 41. class Migration(SchemaMigration): def forwards(self, orm): db.create_table('haikus_haiku', ( ('id', ...), ('user', ...), ('text', ...), ('created', ...), )) def backwards(self, orm): db.delete_table('haikus_haiku')
  • 42. Първоначална миграция $ pip install south $ python manage.py syncdb за съществуващи приложения: $ python manage.py convert_to_south myapp за нови приложения: $ python manage.py schememigration myapp --initial при следващи промени: $ python manage.py schememigration myapp --auto изпълняване на миграции: $ python manage.py migrate
  • 43. myproject/ myapp/ migrations/ 0001_initial.py 0002_add_profile_picture.py 0003_....
  • 44. Тестване на уеб приложения
  • 45. Тестване на уеб приложения • Не тествайте очевидни неща
  • 46. Тестване на уеб приложения • Не тествайте очевидни неща • Тестване “от край до край”
  • 47. Тестване на уеб приложения • Не тествайте очевидни неща • Тестване “от край до край” • HTTP тестове
  • 48. Тестване на уеб приложения • Не тествайте очевидни неща • Тестване “от край до край” • HTTP тестове • Работим с тестови данни
  • 49. Тестване на уеб приложения • Не тествайте очевидни неща • Тестване “от край до край” • HTTP тестове • Работим с тестови данни • JS тестове - Selenium и QUnit
  • 50. # haikus/admin.py from django.contrib import admin from haikus.models import Haiku class HaikuAdmin(admin.ModelAdmin): date_hierarchy = 'created' list_display = ('user', 'text', 'created') admin.site.register(Haiku, HaikuAdmin)
  • 52. Не откривайте топлата вода • django-debug-toolbar - за да не пишем print(“test”)
  • 53. Не откривайте топлата вода • django-debug-toolbar - за да не пишем print(“test”) • django-registration - регистрация на потребители
  • 54. Не откривайте топлата вода • django-debug-toolbar - за да не пишем print(“test”) • django-registration - регистрация на потребители • django-profile - редакция на профили
  • 55. Не откривайте топлата вода • django-debug-toolbar - за да не пишем print(“test”) • django-registration - регистрация на потребители • django-profile - редакция на профили • django.contrib.comments - коментари (а ла блог)
  • 56. Не откривайте топлата вода • django-debug-toolbar - за да не пишем print(“test”) • django-registration - регистрация на потребители • django-profile - редакция на профили • django.contrib.comments - коментари (а ла блог) • django-extensions - улеснения
  • 57. Не откривайте топлата вода • django-debug-toolbar - за да не пишем print(“test”) • django-registration - регистрация на потребители • django-profile - редакция на профили • django.contrib.comments - коментари (а ла блог) • django-extensions - улеснения • django-jsonfield - речници в SQL
  • 58. Не откривайте топлата вода • django-debug-toolbar - за да не пишем print(“test”) • django-registration - регистрация на потребители • django-profile - редакция на профили • django.contrib.comments - коментари (а ла блог) • django-extensions - улеснения • django-jsonfield - речници в SQL • sorl-thumbnail - смаляване на картинки
  • 59. Не откривайте топлата вода • django-debug-toolbar - за да не пишем print(“test”) • django-registration - регистрация на потребители • django-profile - редакция на профили • django.contrib.comments - коментари (а ла блог) • django-extensions - улеснения • django-jsonfield - речници в SQL • sorl-thumbnail - смаляване на картинки • Още: http://djangopackages.com