[9b911db] | 1 | from django.forms.widgets import Widget, Select, HiddenInput |
---|
[a484cbf] | 2 | from django.utils.safestring import mark_safe |
---|
| 3 | from django.utils.html import conditional_escape |
---|
[9b911db] | 4 | from itertools import chain |
---|
[a484cbf] | 5 | |
---|
| 6 | class StaticWidget(Widget): |
---|
| 7 | """Widget that just displays and supplies a specific value. |
---|
| 8 | |
---|
| 9 | Useful for "freezing" form fields --- displaying them, but not |
---|
| 10 | allowing editing. |
---|
| 11 | """ |
---|
| 12 | |
---|
| 13 | def __init__(self, *args, **kwargs): |
---|
| 14 | self.value = kwargs['value'] |
---|
| 15 | del kwargs['value'] |
---|
[9b911db] | 16 | if 'choices' in kwargs: |
---|
| 17 | if kwargs['choices'] is not None: |
---|
| 18 | self.choices = kwargs['choices'] |
---|
| 19 | else: |
---|
| 20 | self.choices = () |
---|
| 21 | del kwargs['choices'] |
---|
| 22 | else: |
---|
| 23 | self.choices = () |
---|
[a484cbf] | 24 | super(StaticWidget, self).__init__(*args, **kwargs) |
---|
| 25 | self.inner = HiddenInput() |
---|
| 26 | |
---|
| 27 | def value_from_datadict(self, data, files, name, ): |
---|
[b63d6b2] | 28 | for choice_value, choice_label in self.choices: |
---|
| 29 | if choice_label == unicode(self.value): |
---|
| 30 | return choice_value |
---|
[a484cbf] | 31 | return self.value |
---|
| 32 | |
---|
[9b911db] | 33 | def render(self, name, value, attrs=None, choices=(), ): |
---|
[a484cbf] | 34 | if value is None: |
---|
| 35 | value = '' |
---|
[9b911db] | 36 | label = value |
---|
| 37 | the_choices = chain(self.choices, choices) |
---|
| 38 | for choice_value, choice_label in the_choices: |
---|
| 39 | if choice_value == value: |
---|
| 40 | label = choice_label |
---|
[a484cbf] | 41 | # We have this inner hidden widget because that allows us to nicely |
---|
| 42 | # handle a transition from StaticWidget to another widget type |
---|
| 43 | # (e.g., the user loads a form while unauthenticated and submits while |
---|
| 44 | # authenticated) |
---|
| 45 | hidden_render = self.inner.render(name, value, attrs=attrs) |
---|
[9b911db] | 46 | return mark_safe(conditional_escape(label) + hidden_render) |
---|
| 47 | |
---|
| 48 | @classmethod |
---|
| 49 | def replace_widget(cls, formfield, value): |
---|
| 50 | choices = None |
---|
| 51 | choices = getattr(formfield.widget, 'choices', ()) |
---|
| 52 | formfield.widget = cls(value=value, choices=choices) |
---|