Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Что нового в Django 1.5

Что нового в Django 1.5

Илья Барышев (Future Colors)
Краткий обзор новых фич готовящегося релиза и советы по переходу.

Moscow Python Meetup
PRO

January 24, 2013
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. View Slide

  2. 10 месяцев разработки
    ~1700 коммитов
    Переезд на гитхаб ~550 closed PR
    Чуточку статистики

    View Slide

  3. https://docs.djangoproject.com/en/dev/releases/1.5/
    Улучшена
    документация
    • CBV
    • Testing Tutorial (part 5)
    • Reusable apps
    • Writing your first patch for Django

    View Slide

  4. Custom User Model

    View Slide

  5. #  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

    View Slide

  6. Обращаемся к модели
    #  settings.py
    AUTH_USER_MODEL  =  'myapp.MyUser'
    #  Django  1.4
    from  django.contrib.auth.models  import  User
    #  Django  1.5
    from  django.contrib.auth  import  get_user_model
    User  =  get_user_model()

    View Slide

  7. AbstractUser
    User
    username
    first_name
    last_name
    email        
    is_staff
    is_active
    date_joined
    USERNAME_FIELD
    REQUIRED_FIELDS
    get_absolute_url()
    get_full_name()
    get_short_name()

    View Slide

  8. AbstractBaseUser
    AbstractUser
    User
    password
    last_login
    get_username()
    is_anonymous()
    is_authenticated()
    set_password(...)
    check_password(...)
    set_unusable_password()
    has_usable_password()

    View Slide

  9. AbstractBaseUser
    AbstractUser
    User
    PermissionsMixin
    get_group_permissions(…)
    get_all_permissions(…)
    has_perm(…)
    has_perms(…)
    has_module_perms(…)
    is_superuser

    View Slide

  10. AbstractBaseUser
    AbstractUser
    User
    PermissionsMixin

    View Slide

  11. Составные ключи
    index_together  =  [
           ["pub_date",
             "deadline"],
    ]

    View Slide

  12. product.save(
         update_fields=['name']
    )
    Частичное сохранение
    моделей

    View Slide

  13. poll  =  Poll.objects.all()[0]
    >>  1  query
    choice  =  poll.choice_set.all()[0]
    >>  1  query
    choice.poll  is  poll
    >>  0  queries
    Кэширование related моделей

    View Slide

  14. Streaming responses
    #  1.4
    response  =  HttpResponse(content=myiterator)
    #  1.5
    response  =  StreamingHttpResponse(
                                 streaming_content=myiterator)
    def  iterator():
           for  x  in  range(1,11):
                   yield  "%s\n"  %  x
                   time.sleep(1)    

    View Slide

  15. {%  verbatim  %}
    {%  verbatim  %}
       
    {%  endverbatim  %}
    JQuery Template
    {{if  morning}}Drink  coffee.{{/if}}

    View Slide

  16. 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 Slide

  17. {{  view.template_name  }}
    Переменная {{ view }}
    body.html
    {{  view.my_attribute  }}
    Hey
    class  MyView(TemplateView):
           template_name  =  'body.html'
           my_attribute  =  'Hey'

    View Slide

  18. #  Django  1.2
    {%  url  viewname  %}
    #  Django  1.3
    {%  load  url  from  future  %}
    {%  url  'viewname'  %}
    #  Django  1.5
    {%  url  'viewname'  %}

    View Slide

  19. https://github.com/futurecolors/django-future-url
    django-­‐make-­‐future-­‐url.py  -­‐-­‐dry-­‐run

    View Slide

  20. QuerySet.bulk_create()
    работает с SQLite3
    Сигнал user_login_failed
    Приятные мелочи
    Стандартные
    404 и 500
    {% if 'someapp.someperm' in perms %}
    GeoDjango PostGIS 2.0
    loaddata(ignorenonexistent=True)
    Получение ContentType
    для прокси-моделей
    django.utils.timezone.localtime
    view.resolver_match
    django logger
    печататает в консоль
    mod_wsgi auth handler
    True, False, Null в шаблонах

    View Slide

  21. Python 3*

    View Slide

  22. Версии Python
    Django 1.3 Python 2.4+
    Django 1.4 Python 2.5+
    Django 1.5 Python 2.6+ Python 3.2+

    View Slide

  23. django.utils.six
    в Django 1.4.2+

    View Slide

  24. #  python  2
    for  k,  v  in  mydict.iteritems():
    #  python  2  &  3
    import  six
    for  k,v  in  six.iteritems(mydict):

    View Slide

  25. #  python  2.6  &  3  
    from  __future__  import  print_function
    print('Hello  world!',  end='  ')
    #  python  2
    print  'Hello  world!',
    #  python  3
    print('Hello  world!',  end='  ')

    View Slide

  26. https://github.com/mitsuhiko/python-modernize
    Автоматизируем six

    View Slide

  27. http://python3porting.com/

    View Slide

  28. View Slide

  29. django
    Pillow
    django-model-utils
    django-picklefield
    embedly-python
    pytils
    django-storages
    docutils
    south
    requests
    django-discover-runner
    mock
    django-nose
    psycopg2
    dj-database-url
    3
    http://moscowdjango.ru/py3/

    View Slide

  30. Пробуйте Django 1.5
    @
    Пишите на Python 3

    View Slide

  31. Спасибо
    [email protected]
    @coagulant http://blog.futurecolors.ru/

    View Slide