Виджет календаря 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 должен автоматически преобразовать ее в поле даты. Наслаждайтесь!
Ответ 2
Вместо виджета администратора подумайте об использовании обычного "SelectDateWidget", встроенного в Django: https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#selectdatewidget
Ответ 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())