diff --git a/django/newforms/widgets.py b/django/newforms/widgets.py index 2241a54c07..30364e1ebc 100644 --- a/django/newforms/widgets.py +++ b/django/newforms/widgets.py @@ -2,9 +2,10 @@ HTML Widget classes """ -__all__ = ('Widget', 'TextInput', 'Textarea', 'CheckboxInput') +__all__ = ('Widget', 'TextInput', 'PasswordInput', 'HiddenInput', 'FileInput', 'Textarea', 'CheckboxInput', 'Select') from django.utils.html import escape +from itertools import chain # Converts a dictionary to a single string with key="value", XML-style. # Assumes keys do not need to be XML-escaped. @@ -17,15 +18,29 @@ class Widget(object): def render(self, name, value): raise NotImplementedError -class TextInput(Widget): +class Input(Widget): + "Base class for all widgets (except type='checkbox', which is special)" + input_type = None # Subclasses must define this. def render(self, name, value, attrs=None): if value is None: value = '' - final_attrs = dict(self.attrs, type='text', name=name) + final_attrs = dict(self.attrs, type=self.input_type, name=name) if attrs: final_attrs.update(attrs) if value != '': final_attrs['value'] = value # Only add the 'value' attribute if a value is non-empty. return u'' % flatatt(final_attrs) +class TextInput(Input): + input_type = 'text' + +class PasswordInput(Input): + input_type = 'password' + +class HiddenInput(Input): + input_type = 'hidden' + +class FileInput(Input): + input_type = 'file' + class Textarea(Widget): def render(self, name, value, attrs=None): if value is None: value = '' @@ -41,3 +56,31 @@ class CheckboxInput(Widget): final_attrs.update(attrs) if value: final_attrs['checked'] = 'checked' return u'' % flatatt(final_attrs) + +class Select(Widget): + def __init__(self, attrs=None, choices=()): + # choices can be any iterable + self.attrs = attrs or {} + self.choices = choices + + def render(self, name, value, attrs=None, choices=()): + if value is None: value = '' + final_attrs = dict(self.attrs, name=name) + if attrs: + final_attrs.update(attrs) + output = [u'') + return u'\n'.join(output) + +class SelectMultiple(Widget): + pass + +class RadioSelect(Widget): + pass + +class CheckboxSelectMultiple(Widget): + pass