1

I want to create one page with both a login and signup form. Per this answer: https://stackoverflow.com/a/1395866/2532070, the best way is to use a separate <form action="{{url}}" tag for each form, and use two different views to handle the POST data for each form. My problem is that using the same view would allow me to pass the errors back to the forms, but if I use separate views with separate urls, I have to redirect the user back to the original page and add these parameters as part of a query string, which doesn't seem very efficient.

My Urls:

url(r'^$', HomePageView.as_view(), name="home_page"),
url(r'^profile/(?P<pk>\d+)/$', MemberUpdate.as_view(template_name="profile.html"), name="profile_page"),
url(r'^signup/$', SignupUser.as_view(), name="signup_user"),

My views:

class HomePageView(TemplateView):
    template_name = "index.html"

    login_form = AuthenticationForm()
    signup_form = UserCreationForm()

    def get_context_data(self, **kwargs):
        context = super(HomePageView, self).get_context_data(**kwargs)
        context['login_form'] = self.login_form
        context['signup_form'] = self.signup_form
        context['signup_action'] = reverse("signup_user")
        return context

class SignupUser(CreateView):
    model = settings.AUTH_USER_MODEL
    form_class = MemberForm
    template_name = "index.html"

    def get_success_url(self):
        return reverse("profile_page", args=[self.object.pk])

    def form_invalid(self, form):

        # here, how do I pass form.errors back to the home_page?
        # I know messages framework is possible but this isn't as
        # easy to add each error to its respective field as 
        # form.errors would be.

        return HttpResponseRedirect(reverse('home_page'))

...and I would have a third view for the login form's POST data. Is this an acceptable way to manage my forms/views, or am I better off simply writing one overall view that distinguishes between the signup and login form within its post method with an if statment?

Community
  • 1
  • 1
YPCrumble
  • 20,703
  • 15
  • 86
  • 149

0 Answers0