Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

882 views

Published on

  • Be the first to comment

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

  1. 1. (Data) Model View TemplateДефинира типовете иструктурата наданните
  2. 2. (Data) Model View TemplateДефинира типовете и Бизнес логикаструктурата наданните
  3. 3. (Data) Model View TemplateДефинира типовете и Бизнес логика Представяне наструктурата на даннитеданните
  4. 4. class Haiku(models.Model): user = models.ForeignKey(User) text = models.TextField() created = models.DateTimeField(default = datetime.now)
  5. 5. @login_requireddef 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)
  6. 6. Generic Views DetailView ListViewqueryset = Haiku.objects.all()context_object_name = “haiku”
  7. 7. <!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>
  8. 8. Сложни темплейти
  9. 9. article.html
  10. 10. base.htmlarticle.html
  11. 11. show_article()
  12. 12. 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 %}
  13. 13. 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>
  14. 14. 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>
  15. 15. {{ 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/
  16. 16. Client/Server Web Browser HT MLDjangoServer
  17. 17. Client/Server Web Browser HT MLDjango JSON JavaScriptServer
  18. 18. Client/Server Web Browser HT MLDjango JSON JavaScriptServer JSO N Desktop App
  19. 19. Client/Server Web Browser HT ML Django JSON JavaScript Server JSO N Desktop AppTwitter: HTML JSON
  20. 20. JSON{ first_name: John, last_name: Smith, friends: [ { name: Jane Smith, id: 123}, { name: Ivana Trump, id: 444}, ],}import jsonjson_text = json.dumps(my_object)my_object_2 = json.loads(json_text)
  21. 21. 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)
  22. 22. Нагодяване на вградени модели
  23. 23. Нагодяване на вградени модели• Monkey patching?
  24. 24. Нагодяване на вградени модели• Monkey patching?• Пренаписваме си ги?
  25. 25. Нагодяване на вградени модели• Monkey patching?• Пренаписваме си ги?• Втори модел!
  26. 26. from django.db import modelsfrom django.contrib.auth.models import Userclass 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) би дало същия резултат
  27. 27. Промени по модела след syncdb?
  28. 28. Промени по модела след syncdb?• Бъркаме в базата данни?
  29. 29. Промени по модела след syncdb?• Бъркаме в базата данни?• Миграции!
  30. 30. Миграции със South
  31. 31. Миграции със South• Миграция: Python клас, който изпълнява промени по структурата на база данни
  32. 32. Миграции със South• Миграция: Python клас, който изпълнява промени по структурата на база данни• Структурата на базата данни започва от нулата и се дефинира чрез поредица от миграции
  33. 33. Миграции със South• Миграция: Python клас, който изпълнява промени по структурата на база данни• Структурата на базата данни започва от нулата и се дефинира чрез поредица от миграции• Консенсус
  34. 34. class Migration(SchemaMigration): def forwards(self, orm): def backwards(self, orm):
  35. 35. 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)
  36. 36. Първоначална миграция$ 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
  37. 37. myproject/ myapp/ migrations/ 0001_initial.py 0002_add_profile_picture.py 0003_....
  38. 38. Тестване на уеб приложения
  39. 39. Тестване на уеб приложения• Не тествайте очевидни неща
  40. 40. Тестване на уеб приложения• Не тествайте очевидни неща• Тестване “от край до край”
  41. 41. Тестване на уеб приложения• Не тествайте очевидни неща• Тестване “от край до край”• HTTP тестове
  42. 42. Тестване на уеб приложения• Не тествайте очевидни неща• Тестване “от край до край”• HTTP тестове• Работим с тестови данни
  43. 43. Тестване на уеб приложения• Не тествайте очевидни неща• Тестване “от край до край”• HTTP тестове• Работим с тестови данни• JS тестове - Selenium и QUnit
  44. 44. # haikus/admin.pyfrom django.contrib import adminfrom haikus.models import Haikuclass HaikuAdmin(admin.ModelAdmin): date_hierarchy = created list_display = (user, text, created)admin.site.register(Haiku, HaikuAdmin)
  45. 45. Не откривайте топлата вода
  46. 46. Не откривайте топлата вода• django-debug-toolbar - за да не пишем print(“test”)
  47. 47. Не откривайте топлата вода• django-debug-toolbar - за да не пишем print(“test”)• django-registration - регистрация на потребители
  48. 48. Не откривайте топлата вода• django-debug-toolbar - за да не пишем print(“test”)• django-registration - регистрация на потребители• django-profile - редакция на профили
  49. 49. Не откривайте топлата вода• django-debug-toolbar - за да не пишем print(“test”)• django-registration - регистрация на потребители• django-profile - редакция на профили• django.contrib.comments - коментари (а ла блог)
  50. 50. Не откривайте топлата вода• django-debug-toolbar - за да не пишем print(“test”)• django-registration - регистрация на потребители• django-profile - редакция на профили• django.contrib.comments - коментари (а ла блог)• django-extensions - улеснения
  51. 51. Не откривайте топлата вода• django-debug-toolbar - за да не пишем print(“test”)• django-registration - регистрация на потребители• django-profile - редакция на профили• django.contrib.comments - коментари (а ла блог)• django-extensions - улеснения• django-jsonfield - речници в SQL
  52. 52. Не откривайте топлата вода• django-debug-toolbar - за да не пишем print(“test”)• django-registration - регистрация на потребители• django-profile - редакция на профили• django.contrib.comments - коментари (а ла блог)• django-extensions - улеснения• django-jsonfield - речници в SQL• sorl-thumbnail - смаляване на картинки
  53. 53. Не откривайте топлата вода• django-debug-toolbar - за да не пишем print(“test”)• django-registration - регистрация на потребители• django-profile - редакция на профили• django.contrib.comments - коментари (а ла блог)• django-extensions - улеснения• django-jsonfield - речници в SQL• sorl-thumbnail - смаляване на картинки• Още: http://djangopackages.com

×