mirror of
https://github.com/django/django.git
synced 2025-10-24 22:26:08 +00:00
Made BoundFields iterable, so that you can iterate over individual radio buttons of a RadioSelect in a template
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17173 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
@@ -410,6 +410,16 @@ class BoundField(StrAndUnicode):
|
||||
return self.as_widget() + self.as_hidden(only_initial=True)
|
||||
return self.as_widget()
|
||||
|
||||
def __iter__(self):
|
||||
"""
|
||||
Yields rendered strings that comprise all widgets in this BoundField.
|
||||
|
||||
This really is only useful for RadioSelect widgets, so that you can
|
||||
iterate over individual radio buttons in a template.
|
||||
"""
|
||||
for subwidget in self.field.widget.subwidgets(self.html_name, self.value()):
|
||||
yield self.as_widget(subwidget)
|
||||
|
||||
def _errors(self):
|
||||
"""
|
||||
Returns an ErrorList for this field. Returns an empty ErrorList
|
||||
|
||||
@@ -156,6 +156,15 @@ class Widget(object):
|
||||
memo[id(self)] = obj
|
||||
return obj
|
||||
|
||||
def subwidgets(self, name, value, attrs=None, choices=()):
|
||||
"""
|
||||
Yields all "subwidgets" of this widget. Used only by RadioSelect to
|
||||
allow template access to individual <input type="radio"> buttons.
|
||||
|
||||
Arguments are the same as for render().
|
||||
"""
|
||||
yield self
|
||||
|
||||
def render(self, name, value, attrs=None):
|
||||
"""
|
||||
Returns this Widget rendered as HTML, as a Unicode string.
|
||||
@@ -628,6 +637,12 @@ class RadioInput(StrAndUnicode):
|
||||
self.index = index
|
||||
|
||||
def __unicode__(self):
|
||||
return self.render()
|
||||
|
||||
def render(self, name=None, value=None, attrs=None, choices=()):
|
||||
name = name or self.name
|
||||
value = value or self.value
|
||||
attrs = attrs or self.attrs
|
||||
if 'id' in self.attrs:
|
||||
label_for = ' for="%s_%s"' % (self.attrs['id'], self.index)
|
||||
else:
|
||||
@@ -681,6 +696,10 @@ class RadioSelect(Select):
|
||||
self.renderer = renderer
|
||||
super(RadioSelect, self).__init__(*args, **kwargs)
|
||||
|
||||
def subwidgets(self, name, value, attrs=None, choices=()):
|
||||
for widget in self.get_renderer(name, value, attrs, choices):
|
||||
yield widget
|
||||
|
||||
def get_renderer(self, name, value, attrs=None, choices=()):
|
||||
"""Returns an instance of the renderer."""
|
||||
if value is None: value = ''
|
||||
|
||||
Reference in New Issue
Block a user