2016-12-25 13 views
1

Я пытаюсь создать форму, где я получаю определенные данные от пользователя.Ошибка Django: TypeError: __init __() получил неожиданный аргумент ключевого слова 'attrs'

Я определил поля в forms.py и я также определение других атрибутов, как заполнителя и CSS класс с использованием Django widget системы. Но он показывает мне 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'}), 
    } 

Я ve читать Django docs for Overriding default fields, а также этот вопрос init() got an unexpected keyword argument 'attrs', но не могу исправить ошибку.

Я довольно новичок в Python и Django и буду благодарен за любую помощь, спасибо.

ответ

1

TL; DR: EmailField это просто, что в Field, который не может быть установлен в качестве виджета, если вы пробовали вы столкнетесь ниже проблемы, вы хотите EmailInput что виджет для EmailField.

Во-первых, TextInput и Textarea принять ключевое слово аргумент attrs в своем __init__. Итак, все в порядке.

Посмотрите на этой линии:

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

EmailField подкласс CharField, который в свою очередь является подклассом 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 

Там is widget аргумент, в котором вы можете поместить виджет так, что делает ключевое слово attrs.

+0

Я разместивший 'EmailField' заявление в' widget' я сделал только или, возможно, что в неправильном пути. –

+0

Да, и в этом проблема. EmailField - это поле, которое принимает виджет. Он не может быть установлен как виджет. – Pythonista

2

Ошибка в строке

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

EmailField представляет собой поле, а не виджет. Виджет по умолчанию для EmailField - EmailIput.

Вы должны предоставить виджет:

'your_email' : EmailInput(attrs={}), 
Смежные вопросы