python - 显示文本框而不是日期选择器的 DateTimeField

标签 python django django-models

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

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 To render the form elements

<!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>

最佳答案

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

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

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

datetime-localtype 传递给内置 Django 小部件的小部件

(不是推荐的方法)

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

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 类型,并且某些浏览器将呈现用于输入日期和时间的小部件。

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

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

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

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

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

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

我应该注意:我个人没有使用过任何这些日期时间选择器。

关于python - 显示文本框而不是日期选择器的 DateTimeField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42623490/

相关文章:

django - 序列化模型时,如何告诉 Django 返回 ImageField.url (而不是相对路径)?

python - Django - 导入错误 : No module named apps

python - 如何在Scrapy中忽略已经爬取的URL

python - Mayavi,python axes INDICATOR

python - DRF json 404 而不是 html 页面

python - 从 Python 程序写入 FIFO

Django 通用关系建模

python - 修复使用 Ajax 从 Django Form 发送数据时出现 "missing 1 required positional argument: ' id'"错误

python - 使用 GenericForeignKey 进行 Django 模型设计

python - 从字面上呈现一个 sympy 表达式,没有简化