Виджет календаря Django в пользовательской форме

Я пытаюсь добавить ввод календаря в одну из моих форм. Существует замечательный виджет календаря, который Django использует на своих страницах администратора, но я не могу понять, как добавить его в пользовательскую форму.

Я нашел пару других вопросов по одному и тому же вопросу здесь, но все они казались устаревшими, сложными и не работали.

Есть ли способ включить Django, встроенный в виджет календаря, в одну из моих форм?

Ответ 1

Я понял это благодаря Дэйву С. и ряду старых сообщений на эту тему. Мой успешный метод:

Создайте пользовательскую форму.

Наверху импортируйте виджеты администратора с помощью from django.contrib.admin.widgets import AdminDateWidget. Затем добавьте различные поля формы, используя my_field = DateField(widget = AdminDateWidget), когда вы хотите использовать виджет даты.

Создайте свой шаблон формы

Поместите следующее вверху, чтобы включить соответствующие файлы css/js:

{% load i18n admin_modify adminmedia %}
{% block extrahead %}{{ block.super }}
<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/base.css" />
<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/widgets.css" />
<script type="text/javascript" src="/jsi18n/"></script>
<script type="text/javascript" src="{% admin_media_prefix %}js/core.js"></script>
{{ form.media }}
{% endblock %}

Примечание. Вам не обязательно все это нужно, в зависимости от вашей версии Django и того, как вы реализуете поля формы. это то, что я обнаружил, что мне нужно использовать виджеты.

Теперь просто выведите форму, как обычно, и JS должен автоматически преобразовать ее в поле даты. Наслаждайтесь!

Ответ 3

Все виджеты, используемые django-admin, находятся в файле django/contrib/admin/widgets.py. Просто используйте это как обычный виджет в форме. Вы хотите, чтобы AdminDateWidget.

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

class MyForm(Form):
    my_field = DateField(widget=AdminDateWidget)

Это создаст сборщик дат с календарем. Вы можете попытаться настроить его на то, что вам нужно, расширив его или создав новый виджет с нуля с вдохновением из AdminDateWidget.

Ответ 4

Это в основном дубликат Использование виджетов времени/даты Django в пользовательской форме.

Ответ предоставлен @Dave S и @MrGlass, но для Django 1.2 и более поздних версий это также понадобится, чтобы помочь JavaScript найти медиа-носитель:

{% load adminmedia %} /* At the top of the template. */

/* In the head section of the template. */
<script type="text/javascript">
window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";
</script>

(из ответ Карла Мейера)

Ответ 5

Вы можете сделать это с помощью виджета формы "SelectDateWidget()", как в этом примере:

class MyForm(forms.Form):

        start_date=forms.DateField(widget = forms.SelectDateWidget())
        end_date=forms.DateField(widget = forms.SelectDateWidget())