Django/Python 在 DateTimeField 上设置最小/最大日期值

Posted

技术标签:

【中文标题】Django/Python 在 DateTimeField 上设置最小/最大日期值【英文标题】:Django/ Python set min/ max date values on 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,但据我了解,这是一个外部库,所以我无法更改它? 【参考方案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 文件。

以上是关于Django/Python 在 DateTimeField 上设置最小/最大日期值的主要内容,如果未能解决你的问题,请参考以下文章

在admin django 1.6中注册抽象模型

DateTimeParseException:无法解析文本:无法从 TemporalAccessor 获取 LocalDateTime

Django]Django Python3出现Error loading MySQLdb module解决

多个设置文件的问题。 Django/Python

在Django中测试django-rq(python-rq)的最佳实践

Django/Python - 检查日期是不是在本周