Илья Барышев (Future Colors) Краткий обзор новых фич готовящегося релиза и советы по переходу.
View Slide
10 месяцев разработки~1700 коммитовПереезд на гитхаб ~550 closed PRЧуточку статистики
https://docs.djangoproject.com/en/dev/releases/1.5/Улучшенадокументация• CBV• Testing Tutorial (part 5)• Reusable apps• Writing your first patch for Django
Custom User Model
# myapp.models.py class MyUser(AbstractUser): email = EmailField(max_length=254, ...) favorite_pony = CharField(max_length=20) ... USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['favorite_pony']Пример custom User model
Обращаемся к модели# settings.pyAUTH_USER_MODEL = 'myapp.MyUser'# Django 1.4from django.contrib.auth.models import User# Django 1.5from django.contrib.auth import get_user_modelUser = get_user_model()
AbstractUserUserusernamefirst_namelast_nameemail is_staffis_activedate_joinedUSERNAME_FIELDREQUIRED_FIELDSget_absolute_url()get_full_name()get_short_name()
AbstractBaseUserAbstractUserUserpasswordlast_loginget_username()is_anonymous()is_authenticated()set_password(...)check_password(...)set_unusable_password()has_usable_password()
AbstractBaseUserAbstractUserUserPermissionsMixinget_group_permissions(…)get_all_permissions(…)has_perm(…)has_perms(…)has_module_perms(…)is_superuser
AbstractBaseUserAbstractUserUserPermissionsMixin
Составные ключиindex_together = [ ["pub_date", "deadline"],]
product.save( update_fields=['name'])Частичное сохранениемоделей
poll = Poll.objects.all()[0]>> 1 querychoice = poll.choice_set.all()[0]>> 1 querychoice.poll is poll>> 0 queriesКэширование related моделей
Streaming responses# 1.4response = HttpResponse(content=myiterator)# 1.5response = StreamingHttpResponse( streaming_content=myiterator)def iterator(): for x in range(1,11): yield "%s\n" % x time.sleep(1)
{% verbatim %}{% verbatim %} {% endverbatim %}JQuery Template{{if morning}}Drink coffee.{{/if}}
https://github.com/chrisdickinson/plate<br/>var template = new plate.Template(<br/> 'Hello {{ world }}');<br/>template.render({world: 'everyone'},<br/> function(err, data) {<br/> console.log(data)<br/> });<br/>
{{ view.template_name }}Переменная {{ view }}body.html{{ view.my_attribute }}Heyclass MyView(TemplateView): template_name = 'body.html' my_attribute = 'Hey'
# Django 1.2{% url viewname %}# Django 1.3{% load url from future %}{% url 'viewname' %}# Django 1.5{% url 'viewname' %}
https://github.com/futurecolors/django-future-urldjango-‐make-‐future-‐url.py -‐-‐dry-‐run
QuerySet.bulk_create()работает с SQLite3Сигнал user_login_failedПриятные мелочиСтандартные404 и 500{% if 'someapp.someperm' in perms %}GeoDjango PostGIS 2.0loaddata(ignorenonexistent=True)Получение ContentTypeдля прокси-моделейdjango.utils.timezone.localtimeview.resolver_matchdjango loggerпечататает в консольmod_wsgi auth handlerTrue, False, Null в шаблонах
Python 3*
Версии PythonDjango 1.3 Python 2.4+Django 1.4 Python 2.5+Django 1.5 Python 2.6+ Python 3.2+
django.utils.sixв Django 1.4.2+
# python 2for k, v in mydict.iteritems():# python 2 & 3import sixfor k,v in six.iteritems(mydict):
# python 2.6 & 3 from __future__ import print_functionprint('Hello world!', end=' ')# python 2print 'Hello world!',# python 3print('Hello world!', end=' ')
https://github.com/mitsuhiko/python-modernizeАвтоматизируем six
http://python3porting.com/
djangoPillowdjango-model-utilsdjango-picklefieldembedly-pythonpytilsdjango-storagesdocutilssouthrequestsdjango-discover-runnermockdjango-nosepsycopg2dj-database-url3http://moscowdjango.ru/py3/
Пробуйте Django 1.5@Пишите на Python 3
Спасибо[email protected]@coagulant http://blog.futurecolors.ru/