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

Preview:

Citation preview

(Data) Model View Template

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

(Data) Model View Template

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

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

(Data) Model View Template

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

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

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

@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)

Generic Views

DetailViewListView

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

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

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

article.html

base.html

article.html

show_article()

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

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

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

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

Client/Server

Django Server

Web Browser

HTML

Client/Server

Django Server

Web Browser

HTML

JavaScript JSON

Client/Server

Django Server

Web Browser

HTML

Desktop App

JSON

JavaScript JSON

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)

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)

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

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

• Monkey patching?

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

• Monkey patching?

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

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

• Monkey patching?

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

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) би дало същия резултат

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

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

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

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

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

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

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

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

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

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

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

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

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

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

• Консенсус

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

def backwards(self, orm):

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):

$ 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

Първоначална миграция

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

# 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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Recommended