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