So, I went ahead and implemented the most useful mixin of the three that I defined previously, the PermissionsMixin. You can see it at https://github.com/ogier/django/blob/permissions-mixin/django/contrib/auth/models.py#L293
This should dramatically simplify the creation of a custom User model in the case that you are OK with Django's default permissions model (and I think many people are). Now instead of reimplementing dumbed-down versions of the permissions code whenever you want to use admin, you can just add PermissionsMixin to your parent classes and *poof* your user model is compatible with contrib.admin (though you still need to roll your own admin class, maybe we can help here too). This would DRY up some of https://docs.djangoproject.com/en/1.5/topics/auth/#a-full-example which could forget about permission-handling code, and still have fully-fledged app permissions. I think this covers 80% of what is missing from the current class hierarchy. Forcing every AbstractBaseUser to have a password isn't strictly required, but seeing as Django's implementation is pretty good and we don't want to encourage people to go rolling their own, it seems like an OK limitation. Forms will still have to be overridden, but that was always inevitable. On Tue, Nov 6, 2012 at 5:02 PM, Anssi Kääriäinen <anssi.kaariai...@thl.fi>wrote: > On 6 marras, 23:05, Alex Ogier <alex.og...@gmail.com> wrote: > <SNIP> > > ... Since you can't actually override or change the fields of an > abstract model anyways (so far as I know?) > > Allowing override of abstract parent's fields is fairly trivial > (https://github.com/akaariai/django/compare/abstract_overrides). > > I don't immediately see a reason to disallow override of abstract > parent's fields. > > Anyways it seems there is some room for improvement in model > validation for abstract parent case: > > class Foo(models.Model): > username = models.CharField(max_length=100) > > class Meta: > abstract = True > > class FooOverride(models.Model): > username = models.CharField(max_length=200) > > class Meta: > abstract = True > > class Bar(Foo, FooOverride): > pass > > print(Bar._meta.fields) > [<django.db.models.fields.AutoField: id>, > <django.db.models.fields.CharField: username>, > <django.db.models.fields.CharField: username>] > > - Anssi > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To post to this group, send email to django-developers@googlegroups.com. > To unsubscribe from this group, send email to > django-developers+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-developers?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.