Answering my own question:
The widget can be declared as part of the field, e.g.
# Field
class MoneyField(MultiValueField):
def __init__(self, currency=(), amount=(), required=True,
widget=None, label=None, initial=None):
widget = widget or MoneyWidget(currency=currency,
amount=amount)
.....
Or something like that.
On Jan 24, 8:36 pm, "canen" <[EMAIL PROTECTED]> wrote:
> Hello All,
>
> I am resending this -- seems it didn't reach the last time, sorry if it
> turns up twice
> ------------
>
> I've been messing around with the new MultiValueField and MultiWidget.
> I don't know if the shortcoming is with me or with the implementation
> of the field and widget. Let's say I want to create a field that
> displays two select fields that are related, I'll use currency display
> as an example. The resulting HTML should look like:
>
> <select name="budget_0" id="id_budget">
> <option value="USD">USD</option>
> <option value="EU">EU</option>
> </select>
> <select name="budget_1" id="id_budget">
> <option value="1000">1000</option>
> <option value="2000">2000</option>
> </select>
>
> and returns a value like "USD 1000". The implementation I have so far
> is:
>
> # Field
> class MoneyField(MultiValueField):
> def __init__(self, currency=(), amount=(), required=True,
> widget=None, label=None, initial=None):
> fields = (ChoiceField(choices=currency),
> ChoiceField(choices=amount))
> super(MoneyField, self).__init__(fields, required, widget,
> label, initial)
>
> def compress(self, data_list):
> if data_list:
> return " ".join(i for i in data_list)
> return None
>
> # Widget
> class MoneyWidget(MultiWidget):
> def __init__(self, attrs=None, currency=(), amount=()):
> widgets = (Select(attrs=attrs, choices=currency),
> Select(attrs=attrs, choices=amount))
> super(MoneyWidget, self).__init__(widgets, attrs)
>
> def decompress(self, value):
> if value:
> return value.split(' ', 1)
> return ['', '']
>
> The problem is, when I use the field I have to repeat the choices for
> both widget and the field, like so:
>
> CURRENCY_CHOICES = [('USD', 'USD'), ('EU', 'EU')]
> AMOUNT_CHOICES = [('1000', '1000'), ('2000', '2000')]
>
> class MyForm(forms.Form):
> budget = MoneyField(
> label="Vacation budget (hotel amount only)",
> currency=CURRENCY_CHOICES,
> amount=AMOUNT_CHOICES,
> required=False,
> widget=MoneyWidget(currency=CURRENCY_CHOICES,
> amount=AMOUNT_CHOICES)
> )
>
> Am I doing something wrong here are is it just a caveat with using
> ChoiceField? Any guidance would be appreciated.
>
> Cheers!
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---