Django日历小部件在自定义窗体中

时间:2011-03-27 13:47:16

标签: django django-forms

我正在尝试将日历日期输入添加到我的某个表单中。 Django在其管理页面上使用了一个精彩的日历小部件,但我无法弄清楚如何将其添加到自定义表单中。

我在这里找到了关于同一主题的其他几个问题,但它们似乎都已过时,复杂且无法正常工作。

有没有办法将Django的内置日历小部件包含在我的一个表单中?

5 个答案:

答案 0 :(得分:17)

考虑使用普通" SelectDateWidget"而不是Admin小部件。内置于Django:https://docs.djangoproject.com/en/stable/ref/forms/widgets/#selectdatewidget

答案 1 :(得分:10)

我想通了,感谢Dave S.和一些关于这个主题的老帖子。我成功的方法:

创建自定义表单。

在顶部,使用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 :(得分:8)

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。

答案 3 :(得分:1)

您可以通过表单小部件“SelectDateWidget()”执行此操作,如下例所示:

class MyForm(forms.Form):

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

答案 4 :(得分:0)

这基本上是Using Django time/date widgets in custom form的副本。

@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>

(来自Carl Meyer's answer