【问题标题】:Django Error: TypeError: __init__() got an unexpected keyword argument 'attrs'Django 错误:TypeError:__init__() 得到了一个意外的关键字参数“attrs”
【发布时间】:2017-05-10 11:26:44
【问题描述】:

我正在尝试创建一个表单,以便从用户那里获取某些详细信息。

我已经在 forms.py 中定义了字段,并且我还在使用 django widget 系统定义了其他属性,例如 placeholdercss 类。但它向我展示了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 还很陌生,如果有任何帮助,我将不胜感激,谢谢。

【问题讨论】:

    标签: django python-3.x django-forms


    【解决方案1】:
    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'}),
            }
    

    导入表单并使用 .运营商

    【讨论】:

      【解决方案2】:

      TL;DREmailField 只是 Field 不能设置为小部件,如果您尝试过您会遇到以下问题,您需要 @ 987654323@ 是EmailField 的小部件。

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

      看看这一行:

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

      EmailFieldCharField 的子类,而Field 又是Field 的子类。在整个层次结构中,attrs 将被传递,直到它到达不接受 attrsField

      这里是__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
      

      有一个可接受的 widget 参数,您可以在其中放置一个 确实接受 attrs 关键字的小部件。

      【讨论】:

      • 我只将EmailField 语句放在widget 中,或者我可能以不正确的方式这样做。
      • 是的,这就是问题所在。 EmailField 是一个Field,它带有一个小部件。不能设置为小部件。
      【解决方案3】:

      错误在一行

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

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

      您需要提供一个小部件:

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

      【讨论】:

        猜你喜欢
        • 2020-06-15
        • 2013-05-05
        • 2017-03-01
        • 2012-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多