自定义表单中的Django日历小部件

s4n0splo  于 2023-05-30  发布在  Go
关注(0)|答案(7)|浏览(168)

我正在尝试将日历日期输入添加到我的一个表单中。Django在其管理页面上使用了一个很棒的日历小部件,但我不知道如何将其添加到自定义表单中。
我在这里找到了关于同一主题的其他几个问题,但它们似乎都过时了,复杂,不起作用。
有没有一种方法可以将Django内置的日历小部件包含到我的表单中?

yruzcnhs

yruzcnhs1#

考虑使用Django内置的普通“SelectDateWidget”来代替Admin小部件:https://docs.djangoproject.com/en/stable/ref/forms/widgets/#selectdatewidget

fdbelqdn

fdbelqdn2#

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中获得灵感从头开始创建新的小部件。

j91ykkif

j91ykkif3#

我明白了,多亏了戴夫·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就会自动将其转换为日期字段。好好享受吧!

vfwfrxfs

vfwfrxfs4#

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

class MyForm(forms.Form):

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

xzabzqsa5#

使用django表单小部件NumberInput作为Django中任何datefield或datetimefield的小部件这将呈现基本的HTML NumberInput字段供用户选择。我刚刚测试了这个,如果你把它当作一个pythondatetime对象,当后端接收到日期时,它就可以工作了。

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'}))
13z8s7eq

13z8s7eq6#

这基本上是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>

(from卡尔·迈耶的回答)

23c0lvtd

23c0lvtd7#

如果有人还在寻找一个整洁的解决方案,那么这里是我在互联网上找到的:
在文件'forms.py'中写入:

from django.forms import DateInput

class DateInput(DateInput):
    input_type = 'date'

class DateForm(Form):
    date = DateField(widget=DateInput)

然后使用'views.py'中的表单:

date = DateForm()

你会看到这样的景象:date widget

相关问题