Slide 1

Slide 1 text

Что нового в Django 1.4 Илья Барышев Moscow Django Meetup #2

Slide 2

Slide 2 text

Чуточку статистики • ровно 1 год разработки • ~1900 коммитов • 28 core committers • 524 человека в AUTHORS.txt

Slide 3

Slide 3 text

Версии Python Django 1.3 Python 2.4-2.7 Django 1.4 Python 2.5-2.7 Django 1.5 Python 2.6-3.3*

Slide 4

Slide 4 text

Часовые пояса

Slide 5

Slide 5 text

ORM • bulk_create() • select_for_update() • prefetch_related()

Slide 6

Slide 6 text

Структура проекта До 1.4 С 1.4 mysite/        __init__.py        manage.py        settings.py        urls.py        myapp/                __init__.py                models.py manage.py mysite/        __init__.py        settings.py        urls.py        myapp/                __init__.py                models.py

Slide 7

Slide 7 text

Новый manage.py #!/usr/bin/env  python import  os,  sys if  __name__  ==  "__main__":    os.environ.setdefault("DJANGO_SETTINGS_MODULE",                                                "{{  project_name  }}.settings")    from  django.core.management  import  execute_from_command_line    execute_from_command_line(sys.argv)

Slide 8

Slide 8 text

Шаблон проекта project_name/        fixtures/        public/        static/        templates/        __init__.py__        __local_settings.py        local_settings.py        settings.py        urls.py          wsgi.py .gitignore manage.py requirements.txt http://bit.ly/django_project_template django-­‐admin.py  startproject  -­‐-­‐template=  

Slide 9

Slide 9 text

Админка • Пользовательские фильтры • Множественная сортировка • Новые методы ModelAdmin • ModelAdmin.save_related(self,  request,  form,  formsets,  change) • ModelAdmin.get_list_display(self,  request) • ModelAdmin.get_list_display_links(self,  request,  list_display) • ADMIN_MEDIA_PREFIX deprecated

Slide 10

Slide 10 text

Шаблоны • {%  elif  %} • {%  static  %} • |truncatechars • Key-value аргументы для тегов • assignment-теги • Контекстные пометки для перевода

Slide 11

Slide 11 text

Assignment-теги @register.assignment_tag def  get_current_time(format_string):        return  datetime.datetime.now().strftime(format_string) {%  get_current_time  "%Y-­‐%m-­‐%d  %I:%M  %p"  as  the_time  %} The  time  is  {{  the_time  }}.

Slide 12

Slide 12 text

Контекстные пометки для перевода {%  trans  "May"  context  "month  name"  %} {%  trans  "May"  context  "verb"  %} {%  blocktrans  with  name=user.username  context  "greeting"  %}        Hi  {{  name  }} {%  endblocktrans  %}

Slide 13

Slide 13 text

URL i18n

Slide 14

Slide 14 text

Безопасность • Новый механизм хэширования паролей • Защита от кликджекинга (clickjacking) • Улучшения в защите от CSRF- и XSS-атак

Slide 15

Slide 15 text

Криптографическая подпись • Низкоуровневое API (Signer) • Бэкенд сессий на подписанных куках • Новый FormWizard на CBV

Slide 16

Slide 16 text

Тестирование • with  TestCase.settings(**kwargs) • и @TestCase.override_settings(**kwargs) • SimpleTestCase • assertRaisesMessage(expected_exception,   expected_message,  callable_obj=None,  *args,  **kwargs) • assertFieldOutput(self,  fieldclass,  valid,  invalid,   field_args=None,  field_kwargs=None,empty_value=u'') • assertHTMLEqual(html1,  html2,  msg=None)

Slide 17

Slide 17 text

Браузерное тестирование class  AdminSeleniumWebDriverTestCase(LiveServerTestCase):        ... class  DateTimePickerSelenium(AdminSeleniumWebDriverTestCase):        def  test_show_hide_date_time_picker_widgets(self):                self.admin_login(username='super',  password='123')                #  Open  a  page  that  has  a  date  and  time  picker  widgets                self.selenium.get('%s%s'  %  (self.live_server_url,                        '/admin_widgets/member/add/'))                #  Check  that  the  date  picker  is  hidden                self.assertEqual(                        self.get_css_value('#calendarbox0',  'display'),  'none')                #  Click  the  calendar  icon                self.selenium.find_element_by_id('calendarlink0').click()                #  Check  that  the  date  picker  is  visible                self.assertEqual(                        self.get_css_value('#calendarbox0',  'display'),  'block')

Slide 18

Slide 18 text

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