我正在尝试将日历日期输入添加到我的其中一个表单中。 Django 在其管理页面上使用了一个很棒的日历小部件,但我不知道如何将其添加到自定义表单中。
我在这里发现了关于同一主题的其他几个问题,但它们似乎都已经过时、复杂且不起作用。
有没有办法将 Django 的内置日历小部件包含到我的表单之一中?
考虑使用 Django 内置的普通“SelectDateWidget”,而不是管理小部件:https://docs.djangoproject.com/en/stable/ref/forms/widgets/#selectdatewidget
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 的启发从头开始创建一个新的小部件。
我想通了,感谢 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 就会自动将其转换为日期字段。享受吧!
您可以通过表单小部件“SelectDateWidget()”来完成此操作,如下例所示:
class MyForm(forms.Form):
start_date=forms.DateField(widget = forms.SelectDateWidget())
end_date=forms.DateField(widget = forms.SelectDateWidget())
使用名为 NumberInput 的 django 表单小部件作为 Django 中任何日期字段或日期时间字段的小部件,这将呈现基本的 HTML NumberInput 字段供用户选择。我刚刚测试了这个,当后端收到日期时,如果你将其视为 python
datetime
对象,它就会起作用
from django.forms.widgets import NumberInput
# label and required are both optional arguments
date_input = forms.DateTimeField(label="Date", required=True, widget=NumberInput(attrs={'type':'date'}))
这基本上是以自定义形式使用 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>
(摘自卡尔·迈耶的回答)