from django.forms.widgets import TextInput, DateInput, DateTimeInput, TimeInput

class MyEmailInput(TextInput):
    input_type = 'email'

class MyNumberInput(TextInput):
    input_type = 'number'

class MyTelephoneInput(TextInput):
    input_type = 'tel'

class MyDateInput(DateInput):
    input_type = 'date'

class MyDateTimeInput(DateTimeInput):
    input_type = 'datetime'

class MyTimeInput(TimeInput):
    input_type = 'time'

...
from django.contrib.localflavor.us.forms import USPhoneNumberField
from my.contrib.forms.widgets import *

class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['return_date'].widget = MyDateInput(attrs={'class':'date'})
        self.fields['passenger_count'].widget = MyNumberInput(attrs={'min':0})
        self.fields['email'].widget = MyEmailInput()

    phone = USPhoneNumberField(
        required=False,
        help_text=u'Phone numbers must be in XXX-XXX-XXXX format',
        label=u'Phone Number',
        widget=MyTelephoneInput()
    )