Django form.as_p DateField没有将输入类型显示为日期

C.B*_*.B. 11 python django django-forms

在我的第一个django应用程序上工作,我有一个模型定义了一些DateFields,然后是一个ModelForm模型,即

models.py

class MyModel(models.Model):
    ...
    my_date = models.DateField('my date')
    ...

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

views.py

def show(request):
    form = MyModelForm
    template_name = 'myapp/show.html'
    return render(request,template_name,{'form':form})
Run Code Online (Sandbox Code Playgroud)

然后在我的HTML中我使用.as_pdjango为我渲染表单

<form action="/show/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

但是DateFields有输入类型文本,而不是日期.有没有办法改变这个?

小智 21

您可以创建自定义小部件:

from django import forms

class DateInput(forms.DateInput):
    input_type = 'date'

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'
        widgets = {
            'my_date': DateInput()
        }
Run Code Online (Sandbox Code Playgroud)

  • 您还可以通过在以表单声明字段时设置字段的“widget”来实现此目的:“start_date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))` (8认同)
  • 有谁知道为什么这不是默认的? (4认同)

jhr*_*hrr 20

没有必要继承DateInput.

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'
        widgets = {
            'my_date': DateInput(attrs={'type': 'date'})
        }
Run Code Online (Sandbox Code Playgroud)


Atm*_*tma 8

start_date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))
Run Code Online (Sandbox Code Playgroud)


MyC*_*Cah 5

使用django-widget-tweaks包,你可以非常简单地通过使用以下命令来完成此操作:

{% load widget_tweaks %}
{{form.date|attr:"type:date"}}
Run Code Online (Sandbox Code Playgroud)

并使该字段成为您班级中的日期时间字段:

date = forms.DateField()
Run Code Online (Sandbox Code Playgroud)