【问题标题】:Django/ Python set min/ max date values on DateTimeFieldDjango/Python 在 DateTimeField 上设置最小/最大日期值
【发布时间】:2017-04-30 00:09:31
【问题描述】:

我有一个 Django 表单,上面显示了一个日期字段,其数据类型为 mDateField(扩展 forms.DateField 的自定义类)。它在 forms.py 中定义:

class mDateField(forms.DateField):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('input_formats', DATE_INPUT_FORMATS)
        super(mDateField, self).__init__(*args, **kwargs)

我现在想为该日期字段设置一个“最小”和“最大”可能值(即一个日期,在过去或将来与今天的日期相关的特定时间长度,该值可以设置为)。

我在 SO:jquery datetime picker set minDate dynamic 上遇到了这个答案,并尝试按照它所说的写下一行:

    presentation_date = mDateTimeField(required=False, widget=forms.DateTimeInput(format='%d/%m/%Y %H:%M', attrs=({'class':'datetimepicker presentation_date', 'name':'presentation_date2'})))
    presentation_date.options.maxDate = $( ".selector" ).datepicker( "option", "maxDate", new Date(2014, 1 - 1, 1));

但是当我这样做时,我在控制台中收到一个语法错误,它指向$,并说:

SyntaxError: 无效语法

我在这里做的有什么问题?如何指定datepicker 中显示的最早/最晚日期应该是什么?

编辑在定义datetimepicker的jQuery文件(jquery.datetimepicker.full.js)中,有以下几行:

if (options.minDate && /^[\+\-](.*)$/.test(options.minDate)) {
    options.minDate = dateHelper.formatDate(_xdsoft_datetime.strToDateTime(options.minDate), options.formatDate);
}

if (options.maxDate &&  /^[\+\-](.*)$/.test(options.maxDate)) {
    options.maxDate = dateHelper.formatDate(_xdsoft_datetime.strToDateTime(options.maxDate), options.formatDate);
}

但我看不出这些是如何将值设置为任何实际日期的......?

【问题讨论】:

  • 但是.. 那是 jQuery 代码。为什么要把它放在 Python 文件中?
  • 啊,所以我应该把它放在 jQuery 代码的某个地方?据我了解,我的 Python 代码引用了一个外部 jQuery 库——我认为我没有任何影响 mDateTimeField 的本地 jQuery 代码......如果我在我的代码中右键单击 datetimepicker,然后“转到定义”它会打开文件 jquery.datetimepicker.full.js,但据我了解,这是一个外部库,所以我无法更改它?

标签: jquery python django date datepicker


【解决方案1】:

好的,首先 - 从 python 文件中删除 javascript 代码;)。 第二 - 您的 django 表单的任何验证都必须在服务器(Django)上完成,而不是前端(JS)!因此,您可以做两件事:
1) 编写自定义小部件并将其添加到您的日期字段(这更难)。
2)使用django默认的DateField(https://docs.djangoproject.com/en/1.10/ref/forms/fields/#datefield):

presentation_date = forms.DateField()

如果使用默认的 DateField,您可以在名为 (clean_your_field_name) 的表单类中编写自定义方法,在您的情况下,它将被称为 clean_presentation_date:

def clean_presentation_date(self, value):
    if value >= some date and value < another_date:
        raise form.ValidationError('The date must be ...')
    return value

【讨论】:

  • 我遇到的问题是,当用户在该字段中单击时,在表单上显示 datetimepickermDateTimeField 只会显示 01/01/2015-01/ 之间的日期01/2017(当我向前/向后滚动显示的日历时)。显然,由于它现在接近 2017 年 1 月 1 日,我需要能够为 2017 年 1 月 1 日之后的日期安排会议,但日历中所有晚于该日期的日期/datetimepicker 都是灰色的,并且无法选择它们。该字段需要是DateTime 值,而不是Date 值...
  • 在我的计算机上搜索定义了datetimepicker 的文件后,我发现它位于project/static/js 中。查看文件的属性时,它指出该库是由 krajee.com 开发的。我查看了plugins.krajee.com 的文档,但看不到对“最小”或“最大”日期值的任何引用。我想知道插件是否不支持这个?但奇怪的是,唯一可供选择的日期是在过去两年内……难道这已经被硬编码到插件中了吗?
  • JavaScript 不在 Python 文件中——它在模板 (.html) 中,并且还有一个被模板“包含”的 .js 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多