【问题标题】:DateTimeField displaying a textbox instead of a date pickerDateTimeField 显示文本框而不是日期选择器
【发布时间】:2017-03-06 10:42:40
【问题描述】:

正在显示当前日期,但它显示在文本框中。我如何获得日期选择器???

models.py

class Comment(models.Model):
    title = models.CharField(max_length=100)
    text = models.CharField(max_length=100)
    notes = models.CharField(max_length=100)
    date = models.DateTimeField("Date", default=datetime.date.today)

    def __str__(self):
        return self.title

forms.py

class MyCommentForm(forms.ModelForm):

    class Meta:
        model = Comment
        fields = ['title', 'text', 'notes', 'date']

views.py

def add_model(request):
    if request.method == 'POST':
        form = MyCommentForm()
        if form.is_valid():
            model_instance = form.save(commit=False)
            model_instance.timestamp = timezone.now()
            model_instance.save()
            # return redirect('/')
    else:
        form = MyCommentForm()
        return render(request, "form/my_template.html", {
            'form': form,
        })

my_template.html 渲染表单元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post">
    {% csrf_token %}
    {{form.as_p}}
    <input type="submit" value="submit"/>
</form>
</body>
</html>

【问题讨论】:

  • 显示在哪里?你如何在模板中呈现这个?您是否包含任何代码来显示日期选择器?
  • @DanielRoseman 我现在添加了我的观点。
  • 谢谢,但我们需要查看模板。
  • 刚刚添加了模板
  • @DanielRoseman,我在这里做错了什么???

标签: python django django-models


【解决方案1】:

假设:您只是让 Django 在模板中按原样呈现字段。

Django 本身不提供日期选择器小部件,并且您发现 Django 用来表示 DateTimeField 的“小部件”是一个简单的文本字段。

要使用日期选择器小部件进行此渲染,您有以下三种选择: (如果你只是想要一个解决方案,直接跳到第三个)

将datetime-local 的type 传递给小部件内置的Django 小部件

(不推荐的方法)

您可以将type 传递给小部件,以使其提供在浏览器中呈现的特定字段类型。 例如

from django.forms.widgets import DateTimeWidget

class MyCommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['title', 'text', 'notes', 'date']
        widgets = {
            'date': DateTimeInput(attrs={'type': 'datetime-local'}),
        }

这将导致该字段具有datetime-local 类型,并且一些浏览器将呈现一个用于输入日期和时间的小部件。

执行此操作时的重要注意事项是字段的value 的日期格式(因为它将在模板中呈现)很重要。它必须是 RFC 3339 格式(例如 2001-10-08T22:47:31-07:00 - PyPI 中有一个 RFC 3339 包https://pypi.python.org/pypi/rfc3339/)

使用客户端日期时间选择器

浏览器对本机日期时间小部件的支持很差,让 Django 的输出与 datetime-local 字段的所需值匹配很烦人。 幸运的是,有相当多的 javascript 库可以提供日期选择器(bootstrap 有一个,比如Flatpickr)

使用包含日期小部件的 Django 插件

有一些插件(例如 django-datetime-widget 和 django-bootstrap3-datetimepicker)允许您使用 Python 类在 Django 表单中添加小部件,然后渲染基于 Javascript 的小部件在客户端。

如果您能找到满意的插件(即它提供了您喜欢的日期/时间选择器),那么这当然是我推荐的选项 - 主要是因为插件应该采用确保 Django 的输出采用基于 Javascript 的选择器可以处理的格式,并且字段中的结果是 Django 可以处理的。

我应该注意:我没有亲自使用过这些日期时间选择器。

【讨论】:

  • 日期问题已解决,但表格未保存到数据库中
  • 你最后做了什么?使用日期时间选择器 django 插件之一?
  • 我也对答案感兴趣。我仍然有 Adi 的问题,键入添加了 datetimepicker 表单,但它没有保存到 DB...所以不是解决方案。
  • @AlexWinkler 你能发布你的模型和模型表格吗?模型/模型表单是否在对日期选择器小部件进行任何更改之前保存?提交表单时,您是否从服务器收到任何错误?
  • 是的,在我添加类型之前一切正常/保存良好:datetime-local attr。没有看到任何错误弹出。昨天在这里发布了这个问题:stackoverflow.com/questions/60128838/…
猜你喜欢
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2017-05-07
  • 2013-09-14
  • 1970-01-01
相关资源
最近更新 更多