On 20 jan 2007, at 17:36, [EMAIL PROTECTED] wrote:

>
>
> Håkan Johansson wrote:
>
>> While working on a complex form using 'newforms' I had some problem
>> with 'initial' data.
>> I have multiple forms using the 'prefix' argument to get different
>> keys for them.
>>
>> As far as I know (*please* correct me if I am wrong) the only way to
>> set initial data dynamically is to create the fields in __init__.
>>
>> Form example ('obj' is object to get initial data from):
>>>>> import django.newforms as forms
>>>>> class DaForm(forms.Form):
>>    ...     def __init__(self, obj, *args, **kw):
>>    ...         super(DaForm, self).__init__(*args, **kw)
>>    ...         self.fields['time'] = forms.TimeField 
>> (initial=obj.time)
>>    ...         self.fields['name'] = forms.CharField 
>> (initial=obj.name)
>>    ...         # etc.
>>
>>>>> # No form data as we are viewing the objects.
>>>>> form1 = DaForm(obj1, prefix='obj1')
>>>>> form2 = DaForm(obj2, prefix='obj2')
>>
>> The problem with the example above is that the initial data for
>> 'form1' is overwritten by the initial data in 'form2' so both forms
>> give the same output. This happens because 'self.fields' belongs to
>> the class and not the object instance.
>>
>> To solve this, you need to override the 'fields' attribute of the
>> object:
>>>>> import django.newforms as forms
>>>>> from django.utils.datastructures import SortedDict
>>>>> class DaForm(forms.Form):
>>    ...     def __init__(self, obj, *args, **kw):
>>    ...         super(DaForm, self).__init__(*args, **kw)
>>    ...         self.fields = SortedDict()
>>    ...         self.fields['time'] = forms.TimeField 
>> (initial=obj.time)
>>    ...         self.fields['name'] = forms.CharField 
>> (initial=obj.name)
>>    ...         # etc.
>>
>> If you have static fields combined with dynamic fields you will need
>> to repopulate 'self.fields' from the class version. Using
>> 'self.fields = self.fields.copy()' does not work as it returns a
>> normal 'dict' and not a 'SortedDict'.
> You don't have to repopulate. You can use:
> self.fields = SortedDictFromList(self.fields.items())
> To create a new SortedDict for self.fields with the correct ordering
> which you can then update.

Thanks for the tip. Much cleaner code.
Note for those interested: The 'SortedDictFromList' class is defined  
in 'django.newforms.forms' and not in 'django.utils.datastructures'.


--~--~---------~--~----~------------~-------~--~----~
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