Hi,

Are you sure you don't get a thread safety issue ?
Do you have your own template tags for those forms ?

Regards,
Xavier.

Le 20 sept. 2010 à 18:42, intrepidweb a écrit :

> Hi all,
> 
> Last week I ported a site that gets 50k+ pageviews/day from a PHP/
> mySQL stack to Django/Postgresql. It has gone mostly smoothly, all
> things considered. However, I have encountered a VERY troubling bug
> involving the forms module, and I can't figure it out.
> 
> The form in question allows users to edit their profile. We have
> several types of users, and each user type has a core set of fields,
> as well as a few unique ones. Rather than write each profile edit form
> from scratch, they inherit from parent classes.
> 
> The profile edit form accepts a User instance in its __init__ method,
> and uses that object to populate the initial data, and also to save
> the cleaned data to the appropriate User and UserProfile instances.
> 
> The problem is in about 20% of the time, the form, when displayed on a
> page, is displaying OTHER users' information as the initial data. I
> have determined that this is not a page caching issue. Additionally, I
> confirmed that the correct user object is being passed to the form
> class. So the form instance itself is switching the user object. My
> guess is that somehow the user object is being assigned as a class
> attribute, not an instance attribute. But otherwise I am stumped.
> 
> Here are snippets of the code. I know the inheritance scheme seems a
> bit convoluted, but it was written this way in the name of DRY. Any
> help would be greatly appreciated.
> 
> Leif
> 
> #####################
> 
> class PostalCodeForm (forms.Form):
>       country = forms.ChoiceField(choices=[(c.country_code,c.en_name) for c
> in Country.objects.all()],required=True, label='Country')
>       postal_code = forms.CharField(required=True, label="ZIP/postal code")
> 
>       def clean_country (self):
>               ...
> 
>       def clean_postal_code (self):
>               ...
> ####
> 
> class UserProfileEditFormBase (forms.Form):
>       first_name = custom_fields.NoProfanitiesCharField(max_length=150,
> help_text = 'Your real first name. We will keep it private.')
>       last_name = custom_fields.NoProfanitiesCharField(max_length=150,
> required=False, help_text = 'Your real last name. We will keep it
> private.')
>       display_name = custom_fields.NoProfanitiesCharField(max_length=40,
> help_text="Your public screenname. Will be shown on reviews that you
> write, comments, etc.", label="Display name")
>       email = custom_fields.EmailField()
>       gender = forms.models.ModelChoiceField(queryset=Gender.objects.all(),
> empty_label=None)
> 
>       def __init__ (self, user, *args, **kwargs):
>               kwargs.setdefault('initial',{})
>               kwargs['initial'] = self.get_initial(user,kwargs['initial'])
>               super(UserProfileEditFormBase,self).__init__(*args, **kwargs)
>               self.user = user
> 
>       def get_initial (self, user, initial={}):
>               for k in self.base_fields.keys():
>                       if k=='country':
>                               initial[k] = getattr(profile,k).country_code
>                       elif k=='postal_code' and getattr(profile,k,None):
>                               initial[k] = getattr(profile,k).postal_code
>                       elif getattr(user,k,None):
>                               initial[k] = getattr(user,k)
>                       elif getattr(profile, k, None):
>                               a = getattr(profile, k)
>                               if hasattr(a,'id'):
>                                       initial[k] = a.id
>                               else:
>                                       initial[k] = a
>               return initial
> 
>       def save (self):
>               # uses self.user to save the cleaned_data
>               ...
> 
> ##########
> 
> class UserProfileEditForm (UserProfileEditFormBase, PostalCodeForm):
> 
>       about_you = forms.CharField(help_text="Description of yourself that
> will appear with reviews and comments that you write.",
> widget=forms.widgets.Textarea, required=False )
> 
>       def get_initial (self, user, initial={}):
> 
>               initial = super(UserProfileEditForm,self).get_initial(user, 
> initial)
>               bios = user.reviewerbio_set.filter(is_primary=True)
>               if bios:
>                       initial['about_you'] = bios[0].text
> 
>               return initial
> 
>       def save (self, user):
>               ....
> 
> ###############
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Django users" group.
> To post to this group, send email to django-us...@googlegroups.com.
> To unsubscribe from this group, send email to 
> django-users+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/django-users?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to