Django中最干净,最简单的运行日期选择器是什么?

Mic*_*isy 38 django datepicker

我喜欢Thauber Schedule datepicker,但它是一个日期时间选择器,我不能只做日期.任何有关如何与Django日期表单字段集成的说明的漂亮日期选择器的建议?

avi*_*avi 33

以下是我的工作,完全没有外部依赖:

models.py:

from django.db import models


class Promise(models):
    title = models.CharField(max_length=300)
    description = models.TextField(blank=True)
    made_on = models.DateField()
Run Code Online (Sandbox Code Playgroud)

forms.py:

from django import forms
from django.forms import ModelForm

from .models import Promise


class DateInput(forms.DateInput):
    input_type = 'date'


class PromiseForm(ModelForm):

    class Meta:
        model = Promise
        fields = ['title', 'description', 'made_on']
        widgets = {
            'made_on': DateInput(),
        }
Run Code Online (Sandbox Code Playgroud)

我的看法:

class PromiseCreateView(CreateView):
    model = Promise
    form_class = PromiseForm
Run Code Online (Sandbox Code Playgroud)

我的模板:

<form action="" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Create" />
</form>
Run Code Online (Sandbox Code Playgroud)

日期选择器如下所示:

在此输入图像描述

  • 这里的注释不适合调试。[代码位于 Github](https://github.com/qznc/family_issue_tracker)。如果你真的想深入研究的话,这是“issues/models.py”中的“截止日期”字段。 (3认同)
  • `CreateView` 来自 Django 本身。这是一个基于通用类的视图 - [链接](https://docs.djangoproject.com/en/dev/ref/class-based-views/generic-editing/#django.views.generic.edit.CreateView) (2认同)
  • 该解决方案非常适合创建视图,但在使用更新视图时会用“dd/mm/yyyy”覆盖从数据库中提取的日期,并且在表单能够提交之前需要再次输入日期,不确定这是怎么回事在 Firefox 中检查元素时,发生的情况表明日期非常多,只是没有显示。有没有人找到解决这个问题的方法? (2认同)
  • @iFunction 我相信这是因为 Django 会在将日期时间放入字段之前“本地化”它(它不知道我们已经更改了输入类型),并在这样做时放弃了可行的格式。您可以通过将 localize=False 添加到 DateField 来解决此问题(https://docs.djangoproject.com/fr/2.2/topics/i18n/formatting/) (2认同)

Ali*_*Ali 19

您也可以在模板中使用Jquery.jquery DateTime Picker允许每个自定义.

http://jqueryui.com/demos/datepicker/

  • Np,祝你的项目好运.但请记住,Jquery只是客户端的javascript.因此,某人可能会使用错误或恶意数据将数据发布到您的表单类,从而验证所有内容并将视图操作放在try/except子句中. (3认同)

Ten*_*Ten 18

Django的TextInput小部件(及其所有子类)支持指定type属性来设置表单类型.

您可以使用它将输入类型设置为date(W3C规范),例如以下列方式:

date = fields.DateField(widget=forms.widgets.DateInput(attrs={'type': 'date'}))
Run Code Online (Sandbox Code Playgroud)

  • 如果您的客户只使用 Chrome 浏览器,这效果非常好。Safari 或 Firefox 目前不支持实现此功能所需的 HTML 属性。 (3认同)
  • 要设置初始值,请将参数initial设置为以下格式 ```DateInput(initial=datetime.now().strftime("%Y-%m-%d"), widget=forms.widgets.DateInput(attrs={'类型': '日期'}))``` (2认同)
  • 在 Django3.1 中需要以下内容: `import datetime` 和 `date = forms.DateField(initial=datetime.date.today, widget=forms.widgets.DateInput(attrs={'type': 'date'}))` (2认同)

小智 9

avi 的解决方案也可以在不使用额外的 django 输入类的情况下完成:

class PromiseForm(ModelForm):

    class Meta:
        model = Promise
        fields = ['title', 'description', 'made_on']
        widgets = {
            'made_on': DateInput(attrs={'type': 'date'}),
        }
Run Code Online (Sandbox Code Playgroud)

  • 你错过了导入:`from django.forms.widgets import DateInput` (3认同)

Mun*_*nna 9

说到日期选择器,我的选择是Bootstrap Datepicker.您可以使用django-bootstrap-datepicker-plus在django应用程序中实现它,它适用于较新和较旧的DJango版本.我维护存储库并测试了它在Django版本工作1.8,1.10,1.112.0.4.

bootstrap datepicker

设置非常简单.你只需安装它.

  pip install django-bootstrap-datepicker-plus
Run Code Online (Sandbox Code Playgroud)

forms.py文件中导入小部件

    from bootstrap_datepicker_plus import DatePickerInput
Run Code Online (Sandbox Code Playgroud)

将小部件添加到日期字段

    class ToDoForm(forms.Form):
        date = forms.DateField(
            widget=DatePickerInput(
                options={
                    "format": "mm/dd/yyyy",
                    "autoclose": True
                }
            )
        )
Run Code Online (Sandbox Code Playgroud)

有关详细说明,请参见django-bootstrap-datepicker-plus Github Page.

免责声明:此小部件包现在由我拥有和维护.对于任何问题,请随时在Github页面上打开问题.


小智 5

作为编码新手,我使用了这个例子,因为它很容易。

<form method="POST">{% csrf_token %}        
    <p>Start date<input type = 'date'  name='start_date' ></p>
    <p>End date<input type = 'date'  name='end_date' ></p>
    <button type="submit">Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)

  • 那不是日期选择器。尽管某些浏览器可能会选择显示日期选择器,但这绝对不是常态。 (3认同)
  • 这是正常的,如*“浏览器必须知道这里面有一个日期”*。然而,规范并没有说明它必须如何显示。Internet Explorer、Firefox 和 Safari 都会将它们显示为常规文本框,这完全符合规范……但不是 OP 想要的。 (3认同)
  • @spectras:事实上,自 HTML5 以来,它*是*规范,请参见[此处](http://www.w3schools.com/html/html_form_input_types.asp) 或[此处](http://html5doctor.com/html5-表单输入类型/)。 (2认同)