Django 表单中的 type="datetime-local"

Ser*_*hii 2 python django

我想了解 Django 表单。

<div class="form-group">
  <label for="deadline">Deadline</label>
  <input
    type="datetime-local"
    class="form-control"
    id="deadline"
    aria-describedby="deadlineHelp"
    placeholder="Enter when deadline"
  />
</div>
Run Code Online (Sandbox Code Playgroud)

我想用 Django 创建这个字段。但

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

创建简单的线条。如果我修复 forms.py 像

class Create(forms.ModelForm):
    class Meta:
        model = Task
        fields = ('deadline_task',)
        widgets = {
           'deadline_task': forms.DateTimeInput(),
        }
Run Code Online (Sandbox Code Playgroud)

它不起作用。

<p><label for="id_deadline_task">Deadline task:</label> <input 
type="text" name="deadline_task" id="id_deadline_task"></p>
Run Code Online (Sandbox Code Playgroud)

我只是想要<input type="datetime-local" - 方便选择日期。
谢谢。
聚苯乙烯Django 1.11

jnn*_*nns 8

正如所指出的,当前接受的解决方案显示正确的 HTML5 小部件,但从前端小部件返回的值不会被后端的字段验证接受。

一个可行的解决方案是使用datetime-local小部件以及DateTimeField识别日期时间格式的自定义:

from django import forms

 
class DateTimeLocalInput(forms.DateTimeInput):
    input_type = "datetime-local"
 
class DateTimeLocalField(forms.DateTimeField):
    # Set DATETIME_INPUT_FORMATS here because, if USE_L10N 
    # is True, the locale-dictated format will be applied 
    # instead of settings.DATETIME_INPUT_FORMATS.
    # See also: 
    # https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats
     
    input_formats = [
        "%Y-%m-%dT%H:%M:%S", 
        "%Y-%m-%dT%H:%M:%S.%f", 
        "%Y-%m-%dT%H:%M",
    ]
    widget = DateTimeLocalInput(format="%Y-%m-%dT%H:%M")


class Form(forms.Form):
    my_datetime_field = DateTimeLocalField()
Run Code Online (Sandbox Code Playgroud)


小智 7

我有完全相同的问题并以这种方式解决:

widgets = {
    'request_date': DateTimeInput(attrs={'type': 'datetime-local'}),
}
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案并不完美。编辑现有对象时,Django 无法使用当前日期时间值填充输入。至少在 Firefox 上,日期时间本地输入的属性值似乎需要类似于 ISO 格式(用 T 分隔日期和时间)。如果不是这种情况,该字段将变为空白,我必须再次选择日期和时间。另一个需要考虑的选项是“SplitDateTimeWidget”。 (2认同)