0

I created a custom user model called Agent by extending AbstractUser. Now for some reason, my signup page is stuck and I can't figure out why (it was working fine before I created the custom user). When I click the Sign Up button, the page is stuck on Waiting for localhost...

There are 2 additional models on top of Agent that are created during registration - AgentBasicInfo and AgentPremiumInfo. AgentBasicInfo is displayed on the sign up page, while AgentPremiumInfo is created in the background, and not actually displayed during registration.

When I check my admin page, I see that an Agent model has been created, but no AgentBasicInfo and AgentPremiumInfo instances have been created. This leads me to believe something is getting stuck at or after agent_basic_info = basic_info_form.save(commit=False), but I can't figure out what it is.

Here is my code:

views.py

def signup(request):
    if request.user.is_authenticated:
        return HttpResponseRedirect('../dashboard/')
    if request.method == 'POST':
        signup_form = SignupForm(request.POST)
        basic_info_form = AgentBasicInfoForm(request.POST)
        if signup_form.is_valid() and basic_info_form.is_valid():

            agent = signup_form.save(commit=False)
            agent.is_active = False
            agent.save()

            # Creates a basic info form with user input
            agent_basic_info = basic_info_form.save(commit=False) 
            agent_basic_info.agent = agent
            agent_basic_info = agent_basic_info.save()

            # Creates a profile model with the agent's premium information, empty except for 'agent' field.  No actual form displayed on sign up page.
            agent_premium_info = AgentPremiumInfo.objects.create(agent=agent) 
            agent_premium_info.save()

            current_site = get_current_site(request)
            message = render_to_string('acc_active_email.html', {
                'agent':agent, 
                'domain':current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(agent.pk)),
                'token': account_activation_token.make_token(agent),
            })
            mail_subject = 'Activate your blog account.'
            to_email = signup_form.cleaned_data.get('email')
            email = EmailMessage(mail_subject, message, to=[to_email])
            email.send()
            return HttpResponse('Please confirm your email address to complete the registration')
    else:
        signup_form = SignupForm()
        basic_info_form = AgentBasicInfoForm()

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


def activate(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        agent = Agent.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, Agent.DoesNotExist):
        agent = None
    if agent is not None and account_activation_token.check_token(agent, token):
        agent.is_active = True
        agent.save()
        login(request, agent)
        # return redirect('home')
        return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
    else:
        return HttpResponse('Activation link is invalid!')

models.py

class Agent(AbstractUser):
    pass

class AgentBasicInfo(models.Model):

    TITLE = (
        ('Salesperson', 'Salesperson'),
        ('Sales Representative', 'Sales Representative'),
        ('Broker', 'Broker'),
        ('Broker of Record', 'Broker of Record'),
    )

    agent = models.OneToOneField(Agent, on_delete=models.CASCADE)
    agent_first_name = models.CharField(max_length=30)
    agent_last_name = models.CharField(max_length=30)
    agent_preferred_email = models.EmailField()
    office_phone_number = models.CharField(max_length=10)
    agent_brokerage = models.CharField(max_length=50)
    agent_title = models.CharField(max_length=20, choices=TITLE)


class AgentPremiumInfo(models.Model):

    agent = models.OneToOneField(Agent, on_delete=models.CASCADE)
    agent_phone_number = models.CharField(max_length=10, blank=True, null=True)
    agent_website = models.CharField(max_length=50, blank=True, null=True)
    agent_biography = models.TextField(blank=True, null=True)
    agent_address_street = models.CharField(max_length=50, blank=True, null=True)
    agent_address_city = models.CharField(max_length=25, blank=True, null=True)
    agent_address_province = models.CharField(max_length=2, choices=PROVINCE, blank=True, null=True) # Add province choices later
    agent_address_postal_code = models.CharField(max_length=6, blank=True, null=True)
    agent_picture = models.ImageField(height_field=200, width_field=100, blank=True, null=True)

forms.py

class SignupForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')

    def clean_email(self):
        data = self.cleaned_data['email']
        if not data.endswith('@gmail.com'):
            raise forms.ValidationError("You must use your @gmail.com Email")
        return data

    class Meta:
        model = Agent
        fields = ('username', 'email', 'password1', 'password2')

class AgentBasicInfoForm(forms.ModelForm):

    class Meta:
        model = AgentBasicInfo
        fields = ['agent_first_name', 'agent_last_name', 'agent_preferred_email', 'office_phone_number', 'agent_brokerage', 'agent_title']

class AgentPremiumInfoForm(forms.ModelForm):

    class Meta:
        model = AgentPremiumInfo
        fields = ['agent_phone_number', 'agent_website', 'agent_biography', 'agent_picture', 'agent_address_street', 'agent_address_city', 'agent_address_province', 'agent_address_postal_code']
Valachio
  • 1,025
  • 2
  • 18
  • 40
  • This is not an answer to the specific question you're asking, but you may be interested it in nonetheless - it may illustrate a simpler way to accomplish your goal: https://stackoverflow.com/questions/1113047/creating-a-model-and-related-models-with-inline-formsets – souldeux Nov 04 '17 at 16:35

1 Answers1

0

It seems something was wrong in the database despite me doing a reset_db. I did another reset_db and it magically fixed the issue.

Valachio
  • 1,025
  • 2
  • 18
  • 40