【问题标题】:Django form.as_p DateField not showing input type as dateDjango form.as_p DateField 未将输入类型显示为日期
【发布时间】:2018-07-30 04:52:57
【问题描述】:

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

models.py

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

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'

views.py

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

然后在我的 html 中,我使用 .as_p 让 django 为我呈现表单

<form action="/show/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>

DateFields 输入类型是文本,而不是日期。有办法改变吗?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    forms.py

    from django import forms
    from .models import MyModel
    from django.forms.widgets import DateInput # need to import
    
    class MyForm(forms.ModelForm):
        class Meta:
            model = MyModel
            fields = '__all__'
            widgets = {
                'my_date': DateInput(attrs={'type': 'date'})
            }
    

    【讨论】:

      【解决方案2】:
      start_date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))
      

      【讨论】:

      • 酷,这很简单。谢谢!
      【解决方案3】:

      直接在forms.Form中使用

      class DateInput(forms.DateInput):
      input_type = 'date'
      
      class Gym(forms.Form):
          starting_date = forms.DateField(widget = DateInput)
      

      【讨论】:

      • 答案如何?作者使用相同的格式,输出结果为文本输入。甚至 django 文档也明确提到 DateInput 小部件类型是文本。
      【解决方案4】:

      安装

      • 运行pip install django-datetimepicker
      • 'datetimepicker' 添加到您的INSTALLED_APPS

      基本用法

      这是一个如何使用小部件的示例。

      。将DateTimePicker 分配给DateTimeFieldDateFieldTimeField

      from django import forms
      from datetimepicker.widgets import DateTimePicker
      
      
      class SampleForm(forms.Form):
           datetime = forms.DateTimeField(widget=DateTimePicker(),)
      

      【讨论】:

        【解决方案5】:

        没有必要继承DateInput

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

        【讨论】:

          【解决方案6】:

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

          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()
                  }
          

          【讨论】:

          • 漂亮而简单。一定要喜欢 python/django
          • 有人知道为什么这不是默认设置吗?
          • 也可以通过在表单中​​声明时设置字段的widget来实现:start_date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))
          • There's a discussion on the Django issue tracker 这解释了为什么默认情况下不生成type="date"
          【解决方案7】:

          使用django-widget-tweaks 包,您可以非常简单地做到这一点:

          {% load widget_tweaks %}
          {{form.date|attr:"type:date"}}
          

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

          date = forms.DateField()
          

          【讨论】:

          • 我曾经有过这个,但使用了同一个包的render_field 模板标签,但它现在似乎停止工作了。我最近更新到 Django 1.11,可能已经不兼容了……
          • 使用widget_tweaks,也可以使用{% render_field form.date type="date" %}
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-02
          • 2015-09-14
          • 2021-10-12
          • 2017-02-04
          相关资源
          最近更新 更多