2017-11-20 23 views
0

この問題は数日間私を悩ませていました。私はどこでも答えを見つけることができませんでした。私は実際にはバグだと思っていますが、私はdjango初心者です。私は間違って何かをしているかもしれないと思ったクラスベースのビューで遊ぶようになったばかりです。Typerror:__init __()に予期しないキーワード引数 'initial'があります。クラスベースのビューとシンプルなフォームを使用しようとするとき

私はモデルを更新するためにLoginRequiredMixinを使って簡単なUpdateViewを作成しましたが、うまく機能しますが、form.pyをカスタマイズして新鮮なフォームを使用しようとするとエラーが発生します。

Here`s私のコード:

models.py

class Profile(TimeStampedModel): 
    LANGUAGES = (
     ('pt_BR', 'Português(Brasil)'), 
     ('en_US', 'English(USA)'), 
    ) 

    user = models.OneToOneField('auth.User') 
    language = models.CharField(max_length=255, choices=LANGUAGES, default=LANGUAGES[0][0]) 

    def get_absolute_url(self): 
     return reverse('edit-profile') 

forms.py

class ProfileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('language',) 
     labels = { 
      'language': 'Idioma', 
     } 

views.py

class ProfileUpdateView(LoginRequiredMixin, UpdateView): 
    form_class = ProfileForm 

    template_name = 'accounts/profile.html' 

    def get_object(self, queryset=None): 
     return self.request.user.profile 

私のテンプレートに{{form.as_p}}を生成すると、これまでのところとてもうまくいっています。

def __init__(self): 
    super().__init__() 
:ちょうどこれらの2行を挿入することで、私は、クリスピーフォームから任意のオブジェクトをインスタンス化する前であっても

class ProfileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('language',) 
     labels = { 
      'language': 'Idioma', 
     } 

    def __init__(self): 
     super().__init__() 

#  self.helper = FormHelper() 
#  ... continue crispy form setup... 

を:今、私は挿入することにより、forms.pyの私ProfileFormクラスをカスタマイズし始めた場合

私はページをロードしようとすると、私は次のようTypeError例外を取得:

__init__() got an unexpected keyword argument 'initial' 

さて、私のunderstadingから、ちょうど任意の追加の引数なしで内部の__init__とsuper()を宣言することで、クラスは直前のように振る舞うべきではなく、私はトレースバックを得る:

Traceback (most recent call last): 
    File "\myvenv\lib\site- 
packages\django\core\handlers\exception.py", line 41, in inner 
    response = get_response(request) 
    File "\myvenv\lib\site- 
packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "\myvenv\lib\site- 
packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "\myvenv\lib\site- 
packages\django\views\generic\base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "\myvenv\lib\site- 
packages\django\contrib\auth\mixins.py", line 56, in dispatch 
    return super(LoginRequiredMixin, self).dispatch(request, *args, 
**kwargs) 
    File "\myvenv\lib\site- 
packages\django\views\generic\base.py", line 88, in dispatch 
    return handler(request, *args, **kwargs) 
    File "\myvenv\lib\site- 
packages\django\views\generic\edit.py", line 236, in get 
    return super(BaseUpdateView, self).get(request, *args, **kwargs) 
    File "\myvenv\lib\site- 
packages\django\views\generic\edit.py", line 174, in get 
    return self.render_to_response(self.get_context_data()) 
    File "\myvenv\lib\site- 
packages\django\views\generic\edit.py", line 93, in get_context_data 
    kwargs['form'] = self.get_form() 
    File "\myvenv\lib\site- 
packages\django\views\generic\edit.py", line 45, in get_form 
    return form_class(**self.get_form_kwargs()) 
TypeError: __init__() got an unexpected keyword argument 'initial' 

私は、Python 3.6を使用しています。 2とDjango 1.11.5。

答えて

0

フォームの署名を変更して、引数を取らないようにしました。しかしフォームは、初期値やデータなどの引数を受け入れる必要があります。期待している引数を引き続き受け入れ、すべてをスーパークラスメソッドに渡す必要があります。これを行う通常の方法は、*args, **kwargsを受け入れることです。

def __init__(self, *args, **kwargs): 
    super().__init__(*args, **kwargs) 
+0

私はsuper().__ init __()を使うことを可能にする新しいPython 3の構文に惑わされていましたが、defで* argsと** kwargsも省略することができました。ありがとう! –

関連する問題