I hope this approach helps you:
1) Write username before saving:
from django.db import models from django.contrib.auth.models import AbstractUser from django.contrib.sites.models import Site from django.contrib.sites.managers import CurrentSiteManager class Member(AbstractUser): site = models.ForeignKey(Site) on_site = CurrentSiteManager() USERNAME_FIELD = 'username' REQUIRED_FIELDS = [] class Meta: unique_together = ('site', 'email') from django.db.models.signals import pre_save from django.dispatch import receiver @receiver(pre_save, sender=Member) def compose_username(sender, instance, **kwargs): instance.username = "{0}__{1}".format( instance.email, instance.site_id )
2) Then rewrite ModelBackend in your user archive:
from django.contrib.auth.backends import ModelBackend from django.contrib.auth import get_user_model class MyModelBackend(ModelBackend): def authenticate(self, username=None, password=None, **kwargs): UserModel = get_user_model() site = kwargs.get('site') identifier = "{0}__{1}".format( username, site ) try: user = UserModel.objects.get(username=identifier) if user.check_password(password): return user except UserModel.DoesNotExist:
3) Remember that you are setting up your own backend in the settings:
AUTH_USER_MODEL='s1.Member' SITE_ID = 1 AUTHENTICATION_BACKENDS = ( 'MyApp.MyModule.MyModelBackend',)
4) Turn on the site during authentication:
>>> from s1.models import Member as M >>> m1 = M() >>> m1.site_id = 1 >>> m1.email = ' peter@hello.com ' >>> m1.save() >>> m1.set_password('hi') >>> m1.save() >>> >>> from django.contrib.auth import authenticate, login >>> u=authenticate(username=' peter@hello.com ', password='hi', site=1) >>> u <Member: peter@hello.com _at_1> >>>
danihp
source share