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