Search code examples
pythondjangodjango-class-based-viewsdjango-users

Django user signup using custom user model not working


I have a Django custom user model 'es_user' which inherit the Django's default user model. when a user signup it works fine but that user will be part of 'Users' and nothing will add upto es_user. so each time a user sign up I've to go to admin panel and add a signed in 'User' to 'es_user'.

So to solve that I added these 2 to lines to views.py

 es_user_instance = es_user.objects.create(user= req_user)
 es_user_instance.save()

which gives me this error

ValueError at /signup/

Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7f9c787b9be0>>": "es_user.user" must be a "User" instance.

models.py

class es_user(models.Model):
user = models.OneToOneField(User,related_name='es_user', on_delete=models.CASCADE)

views.py

def signup(request):
signup_form_instance = SignUpForm()

if request.method == "POST":

    signup_form_instance = SignUpForm(request.POST)
    if signup_form_instance.is_valid():
        signup_form_instance2 = signup_form_instance.save(commit = False)
        req_user = request.user
        signup_form_instance2.password = make_password(signup_form_instance.cleaned_data['password'])
        signup_form_instance2.save()
        es_user_instance = es_user.objects.create(user= req_user)
        es_user_instance.save()

        return index(request)#successful signup redirect or return
    else:
        print("SIGN UP FORM INVALID")

return render(request,'signup.html',{'signup_form':signup_form_instance})

forms.py

class SignUpForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('username', 'email', 'password')

can somebody tell me where is the problem

NOTE: I've used this custom user model because I will be adding many more fields to 'es_user' later on.


Solution

  • The problem is that req_user = request.user is returning an AnonymousUser because you haven't logged in the user yet. So before using request.user, login the user first.

    Alternatively, you could just add the user you just created without logging it in:

    es_user_instance = es_user.objects.create(user=signup_form_instance2)