Save 37% off PRO during our Black Friday Sale! »

Уеб програмиране с Django (лекция 2)

9ed801d49ec5d31475001a504292ce0f?s=47 aandr
April 17, 2013

Уеб програмиране с Django (лекция 2)

9ed801d49ec5d31475001a504292ce0f?s=128

aandr

April 17, 2013
Tweet

Transcript

  1. None
  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>
  9. Сложни темплейти

  10. None
  11. None
  12. article.html

  13. base.html article.html

  14. show_article()

  15. show_article() {% 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 %} article.html
  16. show_article() base.html <!DOCTYPE html> <html> <head> <title> {% block title

    %} New York Times {% endblock %} </title> </head> <body> <header> ... </header> <section> {% block body %} {% endblock %} </section> <footer> ... </footer> </body> </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 %} article.html
  17. show_article() base.html <!DOCTYPE html> <html> <head> <title> {% block title

    %} New York Times {% endblock %} </title> </head> <body> <header> ... </header> <section> {% block body %} {% endblock %} </section> <footer> ... </footer> </body> </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 %} article.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/
  19. None
  20. None
  21. Client/Server Django Server Web Browser HTML

  22. Client/Server Django Server Web Browser HTML JavaScript JSON

  23. Client/Server Django Server Web Browser HTML Desktop App JSON JavaScript

    JSON
  24. Client/Server Django Server Web Browser HTML Desktop App JSON JavaScript

    JSON 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)
  27. Нагодяване на вградени модели

  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) би дало същия резултат
  32. Промени по модела след syncdb?

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

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

    • Миграции!
  35. Миграции със South

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

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

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

    по структурата на база данни • Структурата на базата данни започва от нулата и се дефинира чрез поредица от миграции • Консенсус
  39. None
  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') class Migration(SchemaMigration): def forwards(self, orm): def backwards(self, orm):
  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)
  51. Не откривайте топлата вода

  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