Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add class to Django label_tag() output

I need some way to add a class attribute to the output of the label_tag() method for a forms field.

I see that there is the ability to pass in an attrs dictionary and I have tested it in the shell and I can do something like:

for field in form:     print field.label_tag(attrs{'class':'Foo'}) 

I will see the class='Foo' in my output, but I don't see a way to add an attrs argument from the template - in fact, templates are designed specifically against that, no?

Is there a way in my form definition to define the class to be displayed in the label?

In the form, I can do the following to give the inputs a class

self.fields['some_field'].widget.attrs['class'] = 'Foo' 

I just need to have it output the class for the <label /> as well.

like image 873
ashchristopher Avatar asked Jan 05 '09 22:01

ashchristopher


1 Answers

Technique 1

I take issue with another answer's assertion that a filter would be "less elegant." As you can see, it's very elegant indeed.

@register.filter(is_safe=True) def label_with_classes(value, arg):      return value.label_tag(attrs={'class': arg}) 

Using this in a template is just as elegant:

{{ form.my_field|label_with_classes:"class1 class2"}} 

Technique 2

Alternatively, one of the more interesting technique I've found is: Adding * to required fields.

You create a decorator for BoundField.label_tag that will call it with attrs set appropriately. Then you monkey patch BoundField so that calling BoundField.label_tag calls the decorated function.

from django.forms.forms import BoundField  def add_control_label(f):     def control_label_tag(self, contents=None, attrs=None):         if attrs is None: attrs = {}         attrs['class'] = 'control-label'         return f(self, contents, attrs)      return control_label_tag  BoundField.label_tag = add_control_label(BoundField.label_tag)     
like image 156
user240515 Avatar answered Oct 01 '22 08:10

user240515