Because unless I'm getting some real debbuging issues, request.user is also
changed during the process.

It happens as if all references were pointing to the same object, when i
believe thet, as far as I understand these Django machanisms and
functionalities, this should not happen.

The basic issue I'm trying to understand here, I believe, is "What really
happens and what is the purpose of binding a modelform to an instance?".


On Tue, Dec 18, 2012 at 7:31 PM, Chris Cogdon <ch...@cogdon.org> wrote:

> Rather than comparing to instance, why not compare to request.user ?
>
>
> On Tuesday, December 18, 2012 1:11:21 PM UTC-8, fvianna wrote:
>>
>> Hello everyone,
>>
>> I want to apologize if I came to the wrong place to talk about this, but
>> I've been using Django for a while now, and crossed to a very strange
>> behavior that hits me as bug, but I'm not quite sure. First time trying to
>> get a little deeper and maybe report something to help the community.
>>
>> Django's "How to contribute" page lead me to FAQ, and then here.
>>
>>
>>
>> So, I have a ModelForm to edit some of my auth.User data, here it is:
>>
>> class UserForm(ModelForm):
>>     """ ModelForm for user relevant fields """
>>
>>     class Meta:
>>         model = User
>>         fields = ('first_name', 'last_name', 'email')
>>
>>     def clean_email(self):
>>         cleaned_data = super(UserForm, self).clean()
>>         unavailable_error = ValidationError("Unavailable")
>>         invalid_error = ValidationError("Invalid")
>>
>>         email = cleaned_data.get("email")
>>         if email:
>>             try:
>>                 user_from_form_email = User.objects.get(email=email)
>>                 if user_from_form_email != self.instance:
>>                     raise unavailable_error
>>             except User.DoesNotExist:
>>                 pass
>>             except User.MultipleObjectsReturned:
>>                 raise unavailable_error
>>         else:
>>             raise invalid_error
>>
>>         # Always return the full collection of cleaned data.
>>         return cleaned_data.get("email")
>>
>> Pretty straightforward, with a "unique" verification for the email.
>> In my view, I receive the form with some edited data from a user. The
>> view looks as it follows (just ignore the ajax stuff and error returning):
>>
>>
>> def edit_basic_info(request, id):
>>     response = {'success': False, 'errors': []}
>>
>>     if request.method == 'POST' and request.is_ajax():
>>         u_form = UserForm(request.POST, instance=request.user)
>>
>>         if u_form.is_valid():
>>         if u_form.instance.email != u_form.cleaned_data['email']:
>>             tmp_profile = u_form.instance.get_profile()
>>             tmp_profile.email_confirmed = False
>>             tmp_profile.save()
>>
>>   u_form.save()
>>             response['success'] = True
>>         else:
>>             response['errors'].append(u_**form.errors)
>>
>>
>> When I get to test if the form e-mail is diferent from the instance
>> e-mail in order to set a flag in my model, both emails
>>
>> u_form.instance.email
>>
>> and
>>
>> u_form.cleaned_data['email']
>>
>> are the same. After some debugging, I realized they become the same after
>> calling "is_valid" to the bound form. Now, I'm not sure if I am missing
>> something conceptually about ModelForms binding.
>> Its very ackward to me that I can have a 'instance' field in a ModelForm,
>> but can't distiguish the data after performing the validation. In my case
>> specifically, I need to check first if the email provided by the user is
>> valid, and only then check if its diferent from the instance's e-mail in
>> order to set my flag. But I can't do it, or I will lose the new e-mail
>> provided by the user in the form.
>>
>> Can anyone enlighten this matter? Is this behavior expected?
>> Thank you for your time.
>>
>  --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/django-users/-/e1VZcZs_3loJ.
>
> To post to this group, send email to django-users@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-users@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