Estoy tratando de crear un formulario donde obtengo ciertos detalles del usuario.

He definido campos en forms.py y también estoy definiendo otros atributos como marcador de posición y clase css usando el sistema django widget. Pero me está mostrando un TypeError:

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

El siguiente es mi código:

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

He leído Django docs for Overriding default campos y también esta pregunta init ( ) obtuvo un argumento de palabra clave inesperado 'attrs' pero no puede corregir el error.

Soy bastante nuevo en Python y Django y agradecería cualquier ayuda, gracias.

2
Dhaval Simaria 25 dic. 2016 a las 22:02

3 respuestas

La mejor respuesta

TL; DR : EmailField es solo un Field que no se puede configurar como un widget, si lo intentas te encuentras con el siguiente problema, quieres EmailInput, que es el widget para EmailField.

Primero, TextInput y Textarea aceptan el argumento de la palabra clave attrs en su __init__. Entonces, estos están bien.

Mira esta línea:

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

EmailField es una subclase de CharField que a su vez es una subclase de Field. A lo largo de esta jerarquía, attrs se pasará hasta que llegue a Field, que no acepta attrs.

Como referencia, aquí está el __init__ para 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):

La __init__ para 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

La __init__ para EmailField:

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

Hay un argumento widget aceptado en el que puede colocar un widget que acepta aceptar la palabra clave attrs.

1
Pythonista 25 dic. 2016 a las 19:24
from django.forms import ModelForm
from django import forms
from .models import Contact

class UserForm(ModelForm):
    class Meta:
        model = Contact
        fields = ('sender_name','sender_email')
        widgets = {
            'sender_name': forms.TextInput(attrs={'placeholder': 'Enter sender name'}),
        }

importe formularios y acceda a los campos de formulario con. operador

0
7guyo 25 dic. 2018 a las 04:54

El error esta en linea

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

EmailField es un campo, no un widget. El widget predeterminado para EmailField es EmailIput.

Debe proporcionar un widget:

'your_email' : EmailInput(attrs={}),
3
narendra-choudhary 25 dic. 2016 a las 19:20