Django widget calendar

by Larin

Интро

В одном проекте, мне понадобился визуальный календарик. Брать “сторонние” разработки не хотелось, т.к. хороший календарик уже есть в админке Django. Осталось только его достать )

Легко?

Достать календарик проще простого:

from django import forms
from django.contrib.admin.widgets import AdminDateWidget

class TestForm(forms.Form):
    datefrom = forms.DateTimeField(label='Дата',  widget=AdminDateWidget)

Выглядит все просто и логично. Но, к сожалению этого не достаточно. Данному виджету трубуются дополнительные JS & CSS файлы.

Вначале я попытался сделать свой виджет унаследовав его от AdminDateWidget и дополнив его Meta-класс необходимыми js & css файлами. Но ничего не получилось, файлы подключались не в той последовательности.

Немного кода

# -*- coding: utf-8 -*-
import settings
from django import forms

class CalendarWidget(forms.TextInput):
    '''
    Данный виджет является, практически, копией
    django.contrib.admin.widgets.AdminDateWidget
    Но наследование от AdminDateWidget не удалось из-за неверного
    порядка JS-файлов в результирующем html, при наследовании.

    Для работы необходимо в urls.py добавить:
    (r'^admin/jsi18n/', 'django.views.i18n.javascript_catalog'),
    '''
    class Media:
        js = ('/admin/jsi18n/',
              settings.ADMIN_MEDIA_PREFIX + 'js/core.js',
              settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
              settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js")
        css = {
            'all': (
                settings.ADMIN_MEDIA_PREFIX + 'css/forms.css',
                settings.ADMIN_MEDIA_PREFIX + 'css/base.css',
                settings.ADMIN_MEDIA_PREFIX + 'css/widgets.css',)
        }

    def __init__(self, attrs={}):
        super(CalendarWidget, self).__init__(attrs={'class': 'vDateField', 'size': '10'})

Вот и весь код, но для корректной работы требуется подключение jsi18nurl.py):

urlpatterns += patterns('',
    (r'^admin/jsi18n/', 'django.views.i18n.javascript_catalog'),
)

Результат

P.S.

Примеры кода с другими реализациями данной задачи приветствуются!