A container class used for iterating over widgets. This is useful for widgets that have choices. For example, the following can be used in a template: {% for radio in myform.beatles %} <label for="{{ radio.id_for_label }}"> {{ radio.choice_label }} <span class
| 331 | |
| 332 | @html_safe |
| 333 | class BoundWidget: |
| 334 | """ |
| 335 | A container class used for iterating over widgets. This is useful for |
| 336 | widgets that have choices. For example, the following can be used in a |
| 337 | template: |
| 338 | |
| 339 | {% for radio in myform.beatles %} |
| 340 | <label for="{{ radio.id_for_label }}"> |
| 341 | {{ radio.choice_label }} |
| 342 | <span class="radio">{{ radio.tag }}</span> |
| 343 | </label> |
| 344 | {% endfor %} |
| 345 | """ |
| 346 | |
| 347 | def __init__(self, parent_widget, data, renderer): |
| 348 | self.parent_widget = parent_widget |
| 349 | self.data = data |
| 350 | self.renderer = renderer |
| 351 | |
| 352 | def __str__(self): |
| 353 | return self.tag(wrap_label=True) |
| 354 | |
| 355 | def tag(self, wrap_label=False): |
| 356 | context = {"widget": {**self.data, "wrap_label": wrap_label}} |
| 357 | return self.parent_widget._render(self.template_name, context, self.renderer) |
| 358 | |
| 359 | @property |
| 360 | def template_name(self): |
| 361 | if "template_name" in self.data: |
| 362 | return self.data["template_name"] |
| 363 | return self.parent_widget.template_name |
| 364 | |
| 365 | @property |
| 366 | def id_for_label(self): |
| 367 | return self.data["attrs"].get("id") |
| 368 | |
| 369 | @property |
| 370 | def choice_label(self): |
| 371 | return self.data["label"] |