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

MrG*_*ass 21 django django-forms

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

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

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

rog*_*err 18

而不是Admin小部件,请考虑使用Django中内置的常规"SelectDateWidget":https://docs.djangoproject.com/en/stable/ref/forms/widgets/#selectdatewidget

  • 这是更好的现代方式.其他答案现在太老了. (3认同)
  • 完善!然后唯一需要的是在Form类定义中写:`Date = forms.DateField(widget = forms.SelectDateWidget)` (3认同)
  • 有用的附加组件,用于选择人们可以选择的年份范围(例如,从2017年到2020年):小部件= SelectDateWidget(years = range(2017,2020)) (2认同)

dav*_*ekr 10

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)
Run Code Online (Sandbox Code Playgroud)

这将创建一个带日历的日期选择器.您可以尝试通过扩展它来自定义它,或者从头开始创建一个新的小部件,其灵感来自AdminDateWidget.

  • 当我尝试上面的代码时,我得到一个错误,即没有定义`DateField`.我也试过`forms.DateField`,但后来我最终得到了一个txt字段. (2认同)

MrG*_*ass 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 %}
Run Code Online (Sandbox Code Playgroud)

注意:根据您的Django版本以及如何实现表单字段,您不一定需要所有这些.这就是我发现我需要使用小部件.

现在只需输出正常的表单,JS就会自动将其转换为日期字段.请享用!


Pro*_*mik 5

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

class MyForm(forms.Form):

        start_date=forms.DateField(widget = forms.SelectDateWidget())
        end_date=forms.DateField(widget = forms.SelectDateWidget())
Run Code Online (Sandbox Code Playgroud)