Thanks for the pointers.  I soon came to realise that I did indeed need to
subclass the MultValue classes, and currently have something like this:

class PostcodeField(forms.MultiValueField):
  def compress(self, data_list):
    return ''.join(data_list)

class PostcodeWidget(forms.MultiWidget):
  def __init__(self, attrs=None):
    widgets = (forms.TextInput(attrs=attrs), forms.TextInput(attrs=attrs))
    super(PostcodeWidget, self).__init__(widgets, attrs)
  def decompress(self, value):
    if value:
      return value.split('__')
    return ['', '']
  def format_output(self, rendered_widgets):
    return u''.join(rendered_widgets)

Then in the form class:

  postcode = PostcodeField(
    fields = (
      forms.CharField(max_length = 4),
      forms.CharField(max_length = 4)
    ),
    widget = PostcodeWidget
  )

Far from perfect yet, but I understand a lot more about how this code
functions.

-Phil

On 06/02/07, canen <[EMAIL PROTECTED]> wrote:
>
>
> Phil,
>
> Thought an example might help.
>
> class VacationBudgetField(MultiValueField):
>     def __init__(self, required=True, label=None, widget=None,
> initial=None, f_type=(), currency=(), amount=None):
>         fields = (ChoiceField(choices=f_type),
> ChoiceField(choices=currency), IntegerField())
>         widget = widget or BudgetWidget(f_type=f_type,
> currency=currency, amount=amount)
>         super(VacationBudgetField, self).__init__(fields, required,
> widget, label, initial)
>
>     def compress(self, data_list):
>         if data_list:
>             return " ".join(str(i) for i in data_list)
>         return None
>
> ## Where BuggetWidget is
> class BudgetWidget(MultiWidget):
>     def __init__(self, attrs=None, f_type=(), currency=(),
> amount=None):
>         widgets = (Select(attrs=attrs, choices=f_type),
> Select(attrs=attrs, choices=currency), TextInput())
>         super(BudgetWidget, self).__init__(widgets, attrs)
>
>     def decompress(self, value):
>         if value:
>             return value.split(' ', 2)
>         return ['', '', '']
>
> ## Used it like so...
> budget = VacationBudgetField(f_type=[('a', 'a'), ('b', 'b')],
> currency=[('d', 'd'), ('e', 'e')])
>
> Hope that helps.
>
> On Feb 6, 4:51 pm, "canen" <[EMAIL PROTECTED]> wrote:
> > Phil,
> >
> > I think you must subclass it and define the compress method. See the
> > comments herehttp://code.djangoproject.com/browser/django/trunk/
> > django/newforms/fields.py#L412.  You will also need a MultiWidget to
> > go with the field.
> >
> > On Feb 6, 10:04 am, "Phil Powell" <[EMAIL PROTECTED]> wrote:
> >
> > > Hi,
> >
> > > Can anyone provide any pointers on how I use MultiValueField?  Can I
> > > use it straight out of the box, or do I have to subclass to create a
> > > new field and a new MultiValueWidget?
> >
> > > I thought that this code would just work:
> >
> > > postcode = forms.MultiValueField(fields=(forms.CharField
> (max_length=4),
> > > forms.CharField(max_length=4)))
> >
> > > But all I ever get rendered in my template (using {{ form.postcode }})
> > > is a single text input.
> >
> > > Any advice would be much appreciated.
> >
> > > -Phil
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to