【问题标题】:Django generic View for dealing with two forms occur errorsDjango 通用视图处理两种表单出现错误
【发布时间】:2017-01-01 18:03:40
【问题描述】:

我正在尝试制作django 视图来处理两种表单。 这种视图用于'注册'和'登录'在同一个模板中(例如modal结构,例如http://bootsnipp.com/snippets/featured/login-amp-signup-forms-in-panel

我从这里 (https://chriskief.com/2012/12/30/django-class-based-views-with-multiple-forms/) 有了处理两种表单的想法

我有一个model 供用户使用:

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', ]

还有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')

我开始使用modelformGET 请求实现view

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)

最后我创建user/login.html 并设置网址。但是当我访问它时会发生错误:

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'

我使用embed() 进行调试,发现get_object() 发生错误。但我没有发现导致错误的原因。

需要你的帮助。

【问题讨论】:

    标签: django django-forms django-generic-views


    【解决方案1】:

    这是一个 UpdateView,因此 Django 期望主窗体是一个 ModelForm,它将用于显示模型实例中的值。您可以通过交换主要和次要表单类来解决此问题。

    【讨论】:

    • 对了,为什么要继承UpdateView呢? ..我无法理解。
    猜你喜欢
    • 2017-11-07
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多