59

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

Embed Size (px)

Citation preview

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

(Data) Model View Template

Дефинира типовете и структурата на данните

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

(Data) Model View Template

Дефинира типовете и структурата на данните

Бизнес логика

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

(Data) Model View Template

Дефинира типовете и структурата на данните

Бизнес логика Представяне на данните

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

class Haiku(models.Model): user = models.ForeignKey(User) text = models.TextField() created = models.DateTimeField(default = datetime.now)

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

@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

Generic Views

DetailViewListView

queryset = Haiku.objects.all()context_object_name = “haiku”

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

<!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

Сложни темплейти

Page 10: Програмиране с Питон - Django, част 2
Page 11: Програмиране с Питон - Django, част 2
Page 12: Програмиране с Питон - Django, част 2

article.html

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

base.html

article.html

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

show_article()

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

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

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

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

{{ 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/

Page 19: Програмиране с Питон - Django, част 2
Page 20: Програмиране с Питон - Django, част 2
Page 21: Програмиране с Питон - Django, част 2

Client/Server

Django Server

Web Browser

HTML

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

Client/Server

Django Server

Web Browser

HTML

JavaScript JSON

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

Client/Server

Django Server

Web Browser

HTML

Desktop App

JSON

JavaScript JSON

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

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

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

Нагодяване на вградени модели

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

Нагодяване на вградени модели

• Monkey patching?

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

Нагодяване на вградени модели

• Monkey patching?

• Пренаписваме си ги?

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

Нагодяване на вградени модели

• Monkey patching?

• Пренаписваме си ги?• Втори модел!

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

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

Промени по модела след syncdb?

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

Промени по модела след syncdb?

• Бъркаме в базата данни?

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

Промени по модела след syncdb?

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

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

Миграции със South

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

Миграции със South

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

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

Миграции със South

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

• Структурата на базата данни започва от нулата и се дефинира чрез поредица от миграции

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

Миграции със South

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

• Структурата на базата данни започва от нулата и се дефинира чрез поредица от миграции

• Консенсус

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

class Migration(SchemaMigration): def forwards(self, orm):

def backwards(self, orm):

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

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

$ 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

myproject/ myapp/ migrations/ 0001_initial.py 0002_add_profile_picture.py 0003_....

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

Тестване на уеб приложения

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

Тестване на уеб приложения

• Не тествайте очевидни неща

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

Тестване на уеб приложения

• Не тествайте очевидни неща• Тестване “от край до край”

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

Тестване на уеб приложения

• Не тествайте очевидни неща• Тестване “от край до край”• HTTP тестове

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

Тестване на уеб приложения

• Не тествайте очевидни неща• Тестване “от край до край”• HTTP тестове

• Работим с тестови данни

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

Тестване на уеб приложения

• Не тествайте очевидни неща• Тестване “от край до край”• HTTP тестове

• Работим с тестови данни

• JS тестове - Selenium и QUnit

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

# 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

Не откривайте топлата вода

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

Не откривайте топлата вода

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

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

Не откривайте топлата вода

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

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

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

Не откривайте топлата вода

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

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

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

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

Не откривайте топлата вода

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

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

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

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

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

Не откривайте топлата вода

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

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

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

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

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

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

Не откривайте топлата вода

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

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

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

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

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

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

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

Не откривайте топлата вода

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

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

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

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

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

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

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

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

Не откривайте топлата вода

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

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

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

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

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

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

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

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