2016-12-25 10 views
1

Ich versuche ein Formular zu erstellen, wo ich bestimmte Details vom Benutzer bekomme.Django Fehler: TypeError: __init __() hat ein unerwartetes Schlüsselwortargument 'attrs'

Ich habe definierten Felder in forms.py und ich bin auch andere Attribute wie Platzhalter und CSS-Klasse mit django widget System definieren. Aber es ist mir eine TypeError zeigt:

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

Folgende ist mein Code:

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'}), 
    } 

I‘ Lesen Sie Django docs for Overriding default fields und auch diese Frage init() got an unexpected keyword argument 'attrs' kann aber den Fehler nicht beheben.

Ich bin ziemlich neu bei Python und Django und würde mich über jede Hilfe freuen, danke.

Antwort

1

TL; DR: EmailField ist nur, dass ein Field die als Widget nicht eingestellt werden kann, wenn man versucht, in das unten Problem führen würde, Sie EmailInput möchten, welche das Widget für EmailField ist.

Zuerst, TextInput und Textarea akzeptieren Sie das Schlüsselwort Argument attrs in ihrem __init__. Also, das ist in Ordnung.

Blick auf dieser Linie:

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

EmailField ist eine Unterklasse von CharField wiederum, die eine Unterklasse von Field ist. In dieser Hierarchie wird attrs weitergegeben, bis es Field erreicht, die attrs nicht akzeptiert. hier ist

als Referenz die __init__ für 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): 

Die __init__ für 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 

Die __init__ für EmailField:

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

Es ist ein Widget Argument, das akzeptiert wird, in dem Sie ein Widget platzieren können das Schlüsselwort attrs akzeptiert.

+0

ich die 'EmailField' Anweisung platziert haben in' widget' nur oder wahrscheinlich habe ich das in einer falschen Weise. –

+0

Ja, und das ist das Problem. EmailField ist ein 'Feld', das ein Widget annimmt. Es kann nicht als Widget festgelegt werden. – Pythonista

2

Der Fehler ist in Zeile

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

EmailField ein Feld ist, nicht ein Widget. Standardwidget für EmailField ist EmailIput.

Sie benötigen ein Widget zur Verfügung zu stellen:

'your_email' : EmailInput(attrs={}), 
Verwandte Themen