djangodjango-formsdjango-3.1

Django ".widget.attrs.update" with NO effect


I have a ModelForm with the following init method:

def __init__(self, *args, **kwargs):
    super(FragebogenForm, self).__init__(*args, **kwargs)
    self.fields['birth_date'].widget.attrs.update({'type': 'date'})

This doesn't change the type attribute of the input tag, although it should according to the documentation (ctrl + f -> "Or if the field isn’t declared directly on the form"). If I change it to e.g. .widget.attrs.update({'placeholder': '12.12.1999'}) it works, the new placeholder appears on the page. Only setting the type to date does not work, but why?


Solution

  • The type of the widget is determined by the .input_type attribute, so:

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['birth_date'].widget.input_type = 'date'

    This is however often not a good idea, since other items of the widget are then not altered correctly. Normally you specify the widget in the Meta class:

    class MyForm(forms.ModelForm):
        
        class Meta:
            model = Meta
            widgets = {
                'birth_date': forms.DateInput()
            }

    But if the widget is not a DateInput, then likely the field birth_date in your model is not a models.DateField, so it might be better to fix this instead of solving it at the widget level.