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/-/DuIhW12GWgwJ.
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