2016-12-25 34 views
1

私はユーザーから特定の詳細を取得しているフォームを作成しようとしています。Djangoエラー:TypeError:__init __()に予期しないキーワード引数 'attrs'があります

私はforms.py内のフィールドを定義していると私もジャンゴwidgetシステムを使用してプレースホルダCSSクラスのような他の属性を定義しています。しかし、それは私にTypeErrorを示している。続いて

TypeError: __init__() got an unexpected keyword argument 'attrs' 

は私のコードです:私は「

models.py

from django.db import models 


class Contact(models.Model): 
    your_name = models.CharField(max_length=100) 
    your_email = models.EmailField() 
    your_subject = models.CharField(max_length=100) 
    your_comment = models.TextField(max_length=200) 

def __str__(self): 
    return self.name 

forms.py

from django.forms import ModelForm, TextInput, TextInput, EmailField 
from .models import Contact 

class ContactForm(ModelForm): 
    class Meta: 
     model = Contact 
     fields = ('your_name', 'your_email', 'your_subject', 'your_comment') 
     widgets = { 
      'your_name' : TextInput(attrs={'placeholder': 'Name *', 'class': 'form-control'}), 
      'your_email' : EmailField(attrs={'placeholder': 'Email *', 'class': 'form-control'}), 
      'your_subject' : TextInput(attrs={'placeholder': 'Subject *', 'class': 'form-control'}), 
      'your_comment' : Textarea(attrs={'placeholder': 'Comment *', 'class': 'form-control'}), 
    } 

読んでDjango docs for Overriding default fieldsとこの質問init() got an unexpected keyword argument 'attrs'でもエラーを修正することはできません。

私はPythonとDjangoにはかなり新しく、助けていただければ幸いです。ありがとうございます。

答えて

1

TL; DREmailFieldあなたがEmailFieldためのウィジェットですEmailInputをしたい、あなたがしようとした場合にはウィジェットとして設定することはできませんFieldは、あなたは以下の問題に実行したいだけのことです。

まず、TextInputとは、__init__にキーワード引数attrsを受け入れます。したがって、これらは問題ありません。この行で

ルック:

EmailField(attrs={'placeholder': 'Email *', 'class': 'form-control'}), 

EmailFieldは、順番にFieldのサブクラスであるCharFieldのサブクラスです。この階層全体でattrsFieldに達するまでattrsを受け入れません。参考のため

はここだ__init__Field用:CharFieldため

def __init__(self, required=True, widget=None, label=None, initial=None, 
       help_text='', error_messages=None, show_hidden_initial=False, 
       validators=(), localize=False, disabled=False, label_suffix=None): 

__init__

def __init__(self, max_length=None, min_length=None, strip=True, empty_value='', *args, **kwargs) 

     .... 
     super(CharField, self).__init__(*args, **kwargs) 
     # attrs is passed to Field -> error 

__init__EmailField用:あり

def __init__(self, *args, **kwargs): 
    super(EmailField, self).__init__(*args, strip=True, **kwargs) 
    # attrs is passed to CharField 

ウィジェット引数は、attrsキーワードを受け入れることができるウィジェットを配置することができます。

+0

を。 –

+0

はい、それは問題です。 EmailFieldはウィジェットを取る 'Field'です。ウィジェットとして設定することはできません。 – Pythonista

2

エラーが

'your_email' : EmailField(attrs={}), 

EmailFieldはフィールドではなく、ウィジェットであるラインです。 EmailFieldのデフォルトのウィジェットはEmailIputです。

あなたは、ウィジェットを提供する必要があります:私はのみ、または、おそらく私はその間違った方法で行っているwidget` `で` EmailField`文を置いている

'your_email' : EmailInput(attrs={}), 
関連する問題