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

问题描述 投票:0回答:8

我正在尝试将日历日期输入添加到我的其中一个表单中。 Django 在其管理页面上使用了一个很棒的日历小部件,但我不知道如何将其添加到自定义表单中。

我在这里发现了关于同一主题的其他几个问题,但它们似乎都已经过时、复杂且不起作用。

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

django django-forms
8个回答
28
投票

考虑使用 Django 内置的普通“SelectDateWidget”,而不是管理小部件:https://docs.djangoproject.com/en/stable/ref/forms/widgets/#selectdatewidget


12
投票

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 的启发从头开始创建一个新的小部件。


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 就会自动将其转换为日期字段。享受吧!


5
投票

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

class MyForm(forms.Form):

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

1
投票

使用名为 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'}))

0
投票

这基本上是以自定义形式使用 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>

(摘自卡尔·迈耶的回答


0
投票

如果有人仍在寻找一个简洁的解决方案,那么这是我在互联网上找到的:

写入文件“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


0
投票

您可以使用 enter image description hereDateField 小部件轻松完成此操作。 birth_date = forms.DateField(widget=forms.DateInput(attrs={'type':'date'}))

© www.soinside.com 2019 - 2024. All rights reserved.