Програмиране с Питон - django, част 2
TRANSCRIPT
![Page 1: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/1.jpg)
![Page 2: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/2.jpg)
(Data) Model View Template
Дефинира типовете и структурата на данните
![Page 3: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/3.jpg)
(Data) Model View Template
Дефинира типовете и структурата на данните
Бизнес логика
![Page 4: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/4.jpg)
(Data) Model View Template
Дефинира типовете и структурата на данните
Бизнес логика Представяне на данните
![Page 5: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/5.jpg)
class Haiku(models.Model): user = models.ForeignKey(User) text = models.TextField() created = models.DateTimeField(default = datetime.now)
![Page 6: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/6.jpg)
@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)
![Page 7: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/7.jpg)
Generic Views
DetailViewListView
queryset = Haiku.objects.all()context_object_name = “haiku”
![Page 8: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/8.jpg)
<!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>
![Page 9: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/9.jpg)
Сложни темплейти
![Page 10: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/10.jpg)
![Page 11: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/11.jpg)
![Page 12: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/12.jpg)
article.html
![Page 13: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/13.jpg)
base.html
article.html
![Page 14: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/14.jpg)
show_article()
![Page 15: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/15.jpg)
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
![Page 16: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/16.jpg)
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
![Page 17: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/17.jpg)
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
![Page 18: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/18.jpg)
{{ article.date|date }} # May 26, 2011{{ article.date|timesince }} # 3 days ago{{ article.title|lower }} # bear urinates on mayor{{ aritcle.html|safe }} # My article <abbr>HTML</abbr>
Още: http://docs.djangoproject.com/en/dev/ref/templates/builtins/Можем да си пишем сами: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/
![Page 19: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/19.jpg)
![Page 20: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/20.jpg)
![Page 21: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/21.jpg)
Client/Server
Django Server
Web Browser
HTML
![Page 22: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/22.jpg)
Client/Server
Django Server
Web Browser
HTML
JavaScript JSON
![Page 23: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/23.jpg)
Client/Server
Django Server
Web Browser
HTML
Desktop App
JSON
JavaScript JSON
![Page 24: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/24.jpg)
Client/Server
Django Server
Web Browser
HTML
Desktop App
JSON
JavaScript JSON
Twitter: HTML JSON
![Page 25: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/25.jpg)
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)
![Page 26: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/26.jpg)
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)
![Page 27: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/27.jpg)
Нагодяване на вградени модели
![Page 28: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/28.jpg)
Нагодяване на вградени модели
• Monkey patching?
![Page 29: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/29.jpg)
Нагодяване на вградени модели
• Monkey patching?
• Пренаписваме си ги?
![Page 30: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/30.jpg)
Нагодяване на вградени модели
• Monkey patching?
• Пренаписваме си ги?• Втори модел!
![Page 31: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/31.jpg)
from django.db import modelsfrom 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) би дало същия резултат
![Page 32: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/32.jpg)
Промени по модела след syncdb?
![Page 33: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/33.jpg)
Промени по модела след syncdb?
• Бъркаме в базата данни?
![Page 34: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/34.jpg)
Промени по модела след syncdb?
• Бъркаме в базата данни?• Миграции!
![Page 35: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/35.jpg)
Миграции със South
![Page 36: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/36.jpg)
Миграции със South
• Миграция: Python клас, който изпълнява промени по структурата на база данни
![Page 37: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/37.jpg)
Миграции със South
• Миграция: Python клас, който изпълнява промени по структурата на база данни
• Структурата на базата данни започва от нулата и се дефинира чрез поредица от миграции
![Page 38: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/38.jpg)
Миграции със South
• Миграция: Python клас, който изпълнява промени по структурата на база данни
• Структурата на базата данни започва от нулата и се дефинира чрез поредица от миграции
• Консенсус
![Page 39: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/39.jpg)
![Page 40: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/40.jpg)
class Migration(SchemaMigration): def forwards(self, orm):
def backwards(self, orm):
![Page 41: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/41.jpg)
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):
![Page 42: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/42.jpg)
$ 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
Първоначална миграция
![Page 43: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/43.jpg)
myproject/ myapp/ migrations/ 0001_initial.py 0002_add_profile_picture.py 0003_....
![Page 44: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/44.jpg)
Тестване на уеб приложения
![Page 45: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/45.jpg)
Тестване на уеб приложения
• Не тествайте очевидни неща
![Page 46: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/46.jpg)
Тестване на уеб приложения
• Не тествайте очевидни неща• Тестване “от край до край”
![Page 47: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/47.jpg)
Тестване на уеб приложения
• Не тествайте очевидни неща• Тестване “от край до край”• HTTP тестове
![Page 48: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/48.jpg)
Тестване на уеб приложения
• Не тествайте очевидни неща• Тестване “от край до край”• HTTP тестове
• Работим с тестови данни
![Page 49: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/49.jpg)
Тестване на уеб приложения
• Не тествайте очевидни неща• Тестване “от край до край”• HTTP тестове
• Работим с тестови данни
• JS тестове - Selenium и QUnit
![Page 50: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/50.jpg)
# haikus/admin.pyfrom django.contrib import adminfrom haikus.models import Haiku
class HaikuAdmin(admin.ModelAdmin): date_hierarchy = 'created' list_display = ('user', 'text', 'created')
admin.site.register(Haiku, HaikuAdmin)
![Page 51: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/51.jpg)
Не откривайте топлата вода
![Page 52: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/52.jpg)
Не откривайте топлата вода
• django-debug-toolbar - за да не пишем print(“test”)
![Page 53: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/53.jpg)
Не откривайте топлата вода
• django-debug-toolbar - за да не пишем print(“test”)
• django-registration - регистрация на потребители
![Page 54: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/54.jpg)
Не откривайте топлата вода
• django-debug-toolbar - за да не пишем print(“test”)
• django-registration - регистрация на потребители
• django-profile - редакция на профили
![Page 55: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/55.jpg)
Не откривайте топлата вода
• django-debug-toolbar - за да не пишем print(“test”)
• django-registration - регистрация на потребители
• django-profile - редакция на профили
• django.contrib.comments - коментари (а ла блог)
![Page 56: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/56.jpg)
Не откривайте топлата вода
• django-debug-toolbar - за да не пишем print(“test”)
• django-registration - регистрация на потребители
• django-profile - редакция на профили
• django.contrib.comments - коментари (а ла блог)
• django-extensions - улеснения
![Page 57: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/57.jpg)
Не откривайте топлата вода
• django-debug-toolbar - за да не пишем print(“test”)
• django-registration - регистрация на потребители
• django-profile - редакция на профили
• django.contrib.comments - коментари (а ла блог)
• django-extensions - улеснения
• django-jsonfield - речници в SQL
![Page 58: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/58.jpg)
Не откривайте топлата вода
• django-debug-toolbar - за да не пишем print(“test”)
• django-registration - регистрация на потребители
• django-profile - редакция на профили
• django.contrib.comments - коментари (а ла блог)
• django-extensions - улеснения
• django-jsonfield - речници в SQL
• sorl-thumbnail - смаляване на картинки
![Page 59: Програмиране с Питон - Django, част 2](https://reader034.vdocuments.us/reader034/viewer/2022052223/5584b211d8b42a8f768b46fc/html5/thumbnails/59.jpg)
Не откривайте топлата вода
• django-debug-toolbar - за да не пишем print(“test”)
• django-registration - регистрация на потребители
• django-profile - редакция на профили
• django.contrib.comments - коментари (а ла блог)
• django-extensions - улеснения
• django-jsonfield - речници в SQL
• sorl-thumbnail - смаляване на картинки
• Още: http://djangopackages.com