1

I am creating a small system that has two users, both of these users need singup forms.

To allow social accounts and ease of use i have used django_allauth. But i ran into a problem of creating two custom signin forms with different fields.

i have used multiple stackoverflow answers but unfortunately none have helped if anything they are now adding to the confusion ...

Multiple user type sign up with django-allauth

Multiple signup, registration forms using django-allauth

I find it hard to believe that this is not a use case that comes up a lot, someone must have done this before. My current code has 2 custom signup forms, 2 custom sign-up views and two custom URLs where the forms should be rendered. But they are both using the same form and I have no idea why.

can anyone shed any light on the situation?

from .models import GraduateUserProfile
from django import forms
from allauth.account.forms import SignupForm
import datetime


def year_choices():
    return [(r, r) for r in range(2015, datetime.date.today().year + 1)]


def current_year():
    return datetime.date.today().year


class GraduateUserSignupForm(SignupForm):

    def __init__(self, *args, **kwargs):
        super(GraduateUserSignupForm, self).__init__(*args, **kwargs)
        self.fields['first_name'] = forms.CharField(required=True)
        self.fields['last_name'] = forms.CharField(required=True)
        self.fields['phone_number'] = forms.CharField(required=True)
        self.fields['degree_course_name'] = forms.CharField(required=True)
        self.fields['graduation_year'] = forms.TypedChoiceField(coerce=int, choices=year_choices, initial=current_year)

    def save(self, request):
        user = super(GraduateUserSignupForm, self).save(request)
        user.first_name = self.cleaned_data.get('first_name')
        user.last_name = self.cleaned_data.get('last_name')
        user.is_graduate = True
        user.save()
        graduate = GraduateUserProfile.objects.create(user=user)
        graduate.phone_number = self.cleaned_data.get('phone_number')
        graduate.graduation_year = self.cleaned_data.get('phone_number')
        graduate.degree_course = self.cleaned_data.get('degree_course')
        graduate.save()
        return user


class CompanyUserSignupForm(SignupForm):

    def __init__(self, *args, **kwargs):
        super(CompanyUserSignupForm, self).__init__(*args, **kwargs)
        self.fields['degree_course_name'] = forms.CharField(required=True)
        self.fields['degree_course_test'] = forms.CharField(required=True)

    def save(self, request):
        user = super(CompanyUserSignupForm, self).save(request)
        return user


from .forms import CompanyUserSignupForm, GraduateUserSignupForm
from allauth.account.views import SignupView


class CompanyUserSignupView(SignupView):
    template_name = 'account/company_signup.html'
    form_class = CompanyUserSignupForm
    redirect_field_name = 'next'
    view_name = 'company_signup'
    success_url = None

    def get_context_name(self, **kwargs):
        ret = super(CompanyUserSignupView, self).get_context_data(**kwargs)
        ret.update(self.kwargs)
        return ret


company_signup = CompanyUserSignupView.as_view()


class GraduateUserSignupView(SignupView):
    template_name = 'account/graduate_signup.html'
    form_class = GraduateUserSignupForm
    redirect_field_name = 'next'
    view_name = 'graduate_signup'
    success_url = None

    def get_context_name(self, **kwargs):
        ret = super(GraduateUserSignupView, self).get_context_data(**kwargs)
        ret.update(self.kwargs)
        return ret


grad_signup = GraduateUserSignupView.as_view()
urlpatterns = [
    path('business/signup', view=company_signup, name='company_signup'),
    path('graduate/signup', view=grad_signup, name='graduate_signup'),
]


{% load i18n %}

{% block head_title %}{% trans "Signup" %}{% endblock %}

{% block content %}
<h1>{% trans "Sign Up" %}Grad Sign up</h1>

<p>{% blocktrans %}Already have an account? Then please <a href="{{ login_url }}">sign in</a>.{% endblocktrans %}</p>

<form class="signup" id="company_signup_form" method="post" action="{% url 'graduate_signup' %}">
  {% csrf_token %}
  {{ form.as_p }}
  {% if redirect_field_value %}
  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
  {% endif %}
  <button type="submit">{% trans "Sign Up" %} &raquo;</button>
</form>

{% endblock %}
{% extends "account/base.html" %}

{% load i18n %}

{% block head_title %}{% trans "Signup" %}{% endblock %}

{% block content %}
<h1>{% trans "Sign Up" %}BUSINESS LOGIN</h1>

<p>{% blocktrans %}Already have an account? Then please <a href="{{ login_url }}">sign in</a>.{% endblocktrans %}</p>

<form class="signup" id="graduate_signup_form" method="post" action="{% url 'company_signup' %}">
  {% csrf_token %}
  {{ form.as_p }}
  {% if redirect_field_value %}
  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
  {% endif %}
  <button type="submit">{% trans "Sign Up" %} &raquo;</button>
</form>

{% endblock %}
All Day
  • 147
  • 12

1 Answers1

2

I have just figure it out. If you remove 'signup': 'accounts.forms.GraduateUserSignupForm', my forms are appearing correctly

EDIT: After a few days i found that the original allauth sign up view is still available to view. So i used this little peice of code

path('accounts/signup/', page_not_found, {'exception': Exception('Not Found')}, name="default_signup"),

to throw a 404 if anyone tried to view it

All Day
  • 147
  • 12