Django Abstractuser login fuction problem

41 Views Asked by At

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.

1

There are 1 best solutions below

0
On

The problem was with Backend setting in settings.py

all I had to do was add :

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'account.mybackend.ShenaseBackend', #My backend Modelbackend
)