All these might actually benefit from being part of the generate_custom_widgets function since we're following the HR-XML naming convention and other forms might have the same phone fields. Like this:

    for field in fields:
        internal_type = field.get_internal_type()
        # exclude profile unit base fields
        if field.model == model:
            attrs = {}
            attrs['id'] = 'id_' + model.__name__.lower() + '-' + field.attname
            attrs['placeholder'] = field.verbose_name.title()
            if field.choices:
                widgets[field.attname] = Select()
            elif internal_type == 'BooleanField':
                widgets[field.attname] = CheckboxInput(attrs=attrs)
            else:
                widgets[field.attname] = TextInput(attrs=attrs)
         if field.attname == 'country_dialing':
            attrs['placeholder'] = '+1'
            attrs['class'] = 'phoneCountryCode'
         if field.attname == 'area_dialing:
            attrs['placeholder'] = '555'
            attrs['class'] = 'phoneAreaCode'
         if field.attname == 'number':
            attrs['placeholder'] = '555-5555'
            attrs['class'] = 'phoneNumber'
         if field.attname == 'extension:
            attrs['placeholder'] = 'x1234'
            attrs['class'] = 'phoneExtension'
    return widgets