Upload
alek-andreev
View
700
Download
9
Embed Size (px)
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 <abbr>HTML</abbr>
Още: 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
Client/Server
Django Server
Web Browser
HTML
Desktop App
JSON
JavaScript JSON
Twitter: HTML 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