Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Change the DOM id at form field level

I understand that, by default, Django auto-populates id for each form field upon rendering with the format id_for_%s. One can modify the format by providing the auto_id argument with a different format as its value to the Form constructor.

That's not exactly what I am looking for, however. What I want to accomplish is changing the id of just one of the many fields in my form. Also, the solution should not break the use of form = MyForm(request.POST).

PS. MyForm is a model form, so each id is derived from its corresponding Model field.

Thanks for helping out.

like image 943
tamakisquare Avatar asked Oct 27 '11 00:10

tamakisquare


1 Answers

The forms framework appears to generate labels here:

def _id_for_label(self):
    """
    Wrapper around the field widget's `id_for_label` class method.
    Useful, for example, for focusing on this field regardless of whether
    it has a single widget or a MutiWidget.
    """
    widget = self.field.widget
    id_ = widget.attrs.get('id') or self.auto_id
    return widget.id_for_label(id_)
id_for_label = property(_id_for_label)

Which means you can just supply your field widget with an "id" key to set it to whatever you'd like.

foo = forms.CharField(widget=forms.TextInput(attrs={'id': 'foobar'}))

Or override init and set the attrs after form initialization.

I don't see how this could break a form as django's forms framework isn't ever aware of HTML ids (that data is not passed to the server...)

like image 196
Yuji 'Tomita' Tomita Avatar answered Sep 28 '22 03:09

Yuji 'Tomita' Tomita