2016-12-25 119 views
1

我试图创建一个窗体,我从用户那里得到一些细节。Django错误:TypeError:__init __()得到了一个意外的关键字参数'attrs'

我已经定义在forms.py领域,我使用Django 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是只是不能被设置为一个小部件,如果你试过你会遇到下面的问题Field,你想EmailInput这是EmailField小部件。

首先,TextInputTextarea接受关键字参数attrs在他们的__init__。所以,这些都很好。

看这句话:

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

EmailFieldCharField一个子类,后者又是Field一个子类。在整个层次结构中,attrs将一直传递下去,直到它遇到Field,而不接受attrs

仅供参考这里的__init__Field

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__CharField

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

我已经放在'EmailField'声明'widget'只或可能是我已经做了不正确的方式。 –

+0

是的,这就是问题所在。 EmailField是一个带有小部件的“字段”。它不能被设置为一个小部件。 – Pythonista

2

的错误是在管线

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

EmailField是一个字段,而不是一个小部件。 EmailField的默认控件是EmailIput

您需要提供一个小部件:

'your_email' : EmailInput(attrs={}), 
相关问题