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

时间:2017-03-06 10:42:40

标签: python django django-models

显示当前日期,但它显示在文本框中。我如何获得一个datepicker ????

  

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>

1 个答案:

答案 0 :(得分:0)

假设:你只是让Django在模板中按原样渲染字段。

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

要使用datepicker小部件进行渲染,您有三个选项: (如果你只想要一个解决方案,直接跳到第3个)

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

(不推荐的方法)

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

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-在https://pypi.python.org/pypi/rfc3339/的PyPI中有一个RFC 3339包)

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

对本机日期时间窗口小部件的浏览器支持很差,并且让Django的输出与datetime-local字段所需的值匹配是令人讨厌的。 幸运的是,有很多javascript库提供日期选择器(bootstrap有一个,有Flatpickr之类的东西)

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

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

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

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