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
【讨论】:
我遇到的问题是,当用户在该字段中单击时,在表单上显示datetimepicker
的 mDateTimeField
只会显示 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 上设置最小/最大日期值的主要内容,如果未能解决你的问题,请参考以下文章
DateTimeParseException:无法解析文本:无法从 TemporalAccessor 获取 LocalDateTime
Django]Django Python3出现Error loading MySQLdb module解决