Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

909 vues

Publié le

  • Soyez le premier à commenter

Програмиране с Питон - 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

×