0

I'm trying to make django views for dealing with two forms. This kind of view is used for 'signup' and 'login' are in same template(For instance, modal structure, e.g http://bootsnipp.com/snippets/featured/login-amp-signup-forms-in-panel)

And I got an idea of dealing with two forms from here (https://chriskief.com/2012/12/30/django-class-based-views-with-multiple-forms/)

I have one model for user:

from django.contrib.auth.models import AbstractUser
from django.db import models


GENDER_CHOICES = (
    ('M', '남'),
    ('F', '여'),
)


class ChachaUser(AbstractUser):
    birth = models.DateField()
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

    REQUIRED_FIELDS = ['email', 'birth', 'gender', ]

And form :

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model

GENDER_CHOICES = (
    ('M', '남'),
    ('F', '여'),
)


class MyUserCreationForm(UserCreationForm):

    birth = forms.DateField(
        widget=forms.SelectDateWidget(
            years=range(1970, 2015)
        ),
        required=True,
    )
    gender = forms.ChoiceField(choices=GENDER_CHOICES, initial='M')

    class Meta(UserCreationForm.Meta):
        model = get_user_model()
        fields = UserCreationForm.Meta.fields + ('birth', 'gender')

I start to implement view for GET request with this model and form:

from django.contrib.auth.forms import AuthenticationForm
from django.views.generic import UpdateView
from django.shortcuts import get_object_or_404
from django.core.urlresolvers import reverse_lazy

from users.forms import MyUserCreationForm
from users.models import ChachaUser


class LoginSignupView(UpdateView):

    template_name = 'users/login.html'
    form_class = AuthenticationForm
    second_form_class = MyUserCreationForm
    success_url = '/'

    def get_context_data(self, **kwargs):
        context = super(LoginSignupView, self).get_context_data(**kwargs)
        if 'form' not in context:
            context['form'] = self.form_class()
        if 'form2' not in context:
            context['form2'] = self.second_form_class()
        return context

    def get_object(self):
        return get_object_or_404(ChachaUser, pk=1)

And finally I create user/login.html and set url. But it occurs an error when I access it :

Traceback (most recent call last):
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/views/generic/edit.py", line 275, in get
    return super(BaseUpdateView, self).get(request, *args, **kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/views/generic/edit.py", line 213, in get
    return self.render_to_response(self.get_context_data())
  File "/Users/Chois/Workspace/django/chacha_dabang/chacha_dabang/users/views/login_signup.py", line 18, in get_context_data
    context = super(LoginSignupView, self).get_context_data(**kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/views/generic/edit.py", line 122, in get_context_data
    kwargs['form'] = self.get_form()
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/views/generic/edit.py", line 74, in get_form
    return form_class(**self.get_form_kwargs())
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/contrib/auth/forms.py", line 147, in __init__
    super(AuthenticationForm, self).__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'instance'

I use embed() for debug and realized that get_object() occurs error. But I didn't catch what causes the error.

Need your helps.

user3595632
  • 5,380
  • 10
  • 55
  • 111

1 Answers1

1

This is an UpdateView, so Django is expecting the main form to be a ModelForm which it will use to display the values from the model instance. You might be able to fix the issue by swapping your main and second form classes.

Daniel Roseman
  • 588,541
  • 66
  • 880
  • 895