157 return super(FCKEditor, self).render(form, field) |
157 return super(FCKEditor, self).render(form, field) |
158 |
158 |
159 |
159 |
160 class Select(FieldWidget): |
160 class Select(FieldWidget): |
161 """<select>, for field having a specific vocabulary""" |
161 """<select>, for field having a specific vocabulary""" |
162 def __init__(self, attrs=None, multiple=False): |
162 def __init__(self, attrs=None, multiple=False, sort=False): |
163 super(Select, self).__init__(attrs) |
163 super(Select, self).__init__(attrs) |
164 self.multiple = multiple |
164 self._multiple = multiple |
|
165 self._sort = sort |
165 |
166 |
166 def render(self, form, field): |
167 def render(self, form, field): |
167 name, curvalues, attrs = self._render_attrs(form, field) |
168 name, curvalues, attrs = self._render_attrs(form, field) |
168 if not 'size' in attrs and self.multiple: |
169 if not 'size' in attrs and self._multiple: |
169 attrs['size'] = '5' |
170 attrs['size'] = '5' |
170 options = [] |
171 options = [] |
171 for label, value in field.vocabulary(form): |
172 vocab = field.vocabulary(form) |
|
173 if self._sort: |
|
174 vocab = sorted(vocab) |
|
175 for label, value in vocab: |
172 if value is None: |
176 if value is None: |
173 # handle separator |
177 # handle separator |
174 options.append(u'<optgroup label="%s"/>' % (label or '')) |
178 options.append(u'<optgroup label="%s"/>' % (label or '')) |
175 elif value in curvalues: |
179 elif value in curvalues: |
176 options.append(tags.option(label, value=value, selected='selected')) |
180 options.append(tags.option(label, value=value, selected='selected')) |
177 else: |
181 else: |
178 options.append(tags.option(label, value=value)) |
182 options.append(tags.option(label, value=value)) |
179 return tags.select(name=name, multiple=self.multiple, |
183 return tags.select(name=name, multiple=self._multiple, |
180 options=options, **attrs) |
184 options=options, **attrs) |
181 |
185 |
182 |
186 |
183 class CheckBox(Input): |
187 class CheckBox(Input): |
184 """<input type='checkbox'>, for field having a specific vocabulary. One |
188 """<input type='checkbox'>, for field having a specific vocabulary. One |