I am trying to use Django AbstractUser model to create my own user model, Everything seems to be working fine but my single login/register form seems to be having a problem and that is the Register and login function works fine and registers the users but they are not getting logged in.but the users are not staying logged in and in views that are required for user to be authenticated I get error that Anonymous user is visiting that view. my account Model file is as below :
class MyUserManager(BaseUserManager):
def create_user(self, shenase, password=None, **other_fields):
if not shenase:
raise ValueError("shenase is required...!")
user = self.model(shenase=shenase, **other_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, shenase, password=None, **other_fields):
other_fields.setdefault('is_staff', True)
other_fields.setdefault('is_superuser', True)
other_fields.setdefault('is_active', True)
if other_fields.get('is_staff') is not True:
raise ValueError('Superuser muse have is_staff=True')
if other_fields.get('is_superuser') is not True:
raise ValueError('Superuser muse have is_superuser=True')
return self.create_user(shenase, password, **other_fields)
def random_string():
return str(random.randint(1000000, 9999999))
class MyUser(AbstractUser):
username = None
shenase = models.CharField(max_length=11, unique=True)
eshterak = models.CharField(max_length=7,default=random_string, null=True, blank=True, unique=True)
created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)
objects = MyUserManager()
USERNAME_FIELD = 'shenase'
REQUIRED_FIELDS = []
backend = 'account.mybackend.ModelBackend'
and my views file is :
def register_view(request):
form = forms.RegisterForm
if request.method == "POST":
try:
if "shenase" in request.POST:
shenase = request.POST.get('shenase')
user = MyUser.objects.get(shenase=shenase)
user.save()
request.session['user_shenase'] = user.shenase
return HttpResponseRedirect(reverse('account:welcome'))
except MyUser.DoesNotExist:
form = forms.RegisterForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
request.session['user_shenase'] = user.shenase
return HttpResponseRedirect(reverse('account:welcome'))
return render(request, 'account/register.html', {'form': form})
def welcome(request):
try:
shenase = request.session.get('user_shenase')
user = MyUser.objects.get(shenase = shenase)
user.is_active = True
user.save()
login(request, user)
return render(request, 'account/welcome.html', {'shenase': shenase})
except MyUser.DoesNotExist:
messages.error(request, "Error accorded, try again.")
return HttpResponseRedirect(reverse('account:register_view'))
I should mention that my User model does not have password. if user enters an already registered Username (in my case 'shenase') they get logged in and if the username has not been entered before they get registered and then logged in and forward to welcome page.
any help would be appreciated.
The problem was with Backend setting in settings.py
all I had to do was add :