Hello all!

I noticed that when calling contrib.auth.forms.UserCreationForm.save(), 
self.save_m2m() is not called when commit=True.

This caused an issue in one of my projects which uses a custom User model 
with ManyToMany fields. Is this something that should be changed? I saw in 
the docs [1] that it is advised to extend UserCreationForm and 
UserChangeForm if using a custom User model.

A few reasons I see to add this step to the UserCreationForm.save() method:

   - UserCreationForm is a subclass of ModelForm, which does call 
   save_m2m() when commit=True.
   - UserChangeForm *does* call save_m2m() as part of save(), because the 
   save() method is not overloaded. This seems inconsistent!

The solution I'd propose is:

class UserCreationForm(forms.ModelForm):
    ...
    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
*            if hasattr(self, "save_m2m"):*
*                self.save_m2m()*
        return user

I'd be happy to raise a ticket and work on a patch if this change would be 
useful.

Thanks
Mark

[1] 
https://docs.djangoproject.com/en/dev/topics/auth/customizing/#custom-users-and-the-built-in-auth-forms

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/c8dac66b-4a0f-4afa-b548-260fffb06e9fn%40googlegroups.com.
  • Cal... Mark Gensler
    • ... 'Adam Johnson' via Django developers (Contributions to Django itself)
      • ... Mark Gensler

Reply via email to