如何在Django中覆盖ModelForm的'type'属性?

时间:2012-10-26 20:58:17

标签: python django html5 django-widget

具体来说,我想在一个表单中呈现日期小部件,但我希望它“成为”HTML5(所以我可以忘记javascript或其他任何东西并相信Chrome,Opera和Safari来显示日期选择器)。< / p>

请不要使用javascript解决方案,我已经在网上找到了这些解决方案。

以下是我的代码片段,但它仍然将表单字段 thedate 的type属性设置为“text”。

#models.py

class MyModel(models.Model):
    user = models.ForeignKey(User)
    thedate = models.DateField()

#forms.py

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'thedate': TextInput(attrs={'type': 'date'}),
        }

任何人都可以发光吗?

提前致谢。

3 个答案:

答案 0 :(得分:12)

使用django-html5

  1. 安装django-html5pip install django-html5

  2. 在forms.py,import html5.forms.widgets as html5_widgets

  3. 设置widgets['thedate'] = html5_widgets.DateInput

  4. 我没有亲自测试它,因为我发现了诀窍但是多亏了你我可能会用它:D

    只需覆盖input_type

    你也可以制作自己的小部件,这就是想法:

    from django import forms
    
    class Html5DateInput(forms.DateInput):
        input_type = 'date'
    

    有关详细信息,请参阅django/forms/widgets.py。)

答案 1 :(得分:3)

这是一个简单的:

将此代码放在form.py

的任何位置
forms.DateInput.input_type="date"
forms.DateTimeInput.input_type="datetime-local" 

答案 2 :(得分:2)

这里是一个基本上是jpic解决方案的代码片段,以及我在寻找答案后使用的内容 - &gt;

class EmailTextInput(django.forms.widgets.TextInput):
    """Subclass TextInput since there's no direct way to override its type attribute"""
    input_type ='email'

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'thedate': EmailTextInput()
        }