自定义 Django 小部件/字段:对象没有属性“attrs”

Posted

技术标签:

【中文标题】自定义 Django 小部件/字段:对象没有属性“attrs”【英文标题】:Custom Django Widgets/Fields: object has no attribute 'attrs' 【发布时间】:2015-08-07 12:20:49 【问题描述】:

我正在尝试在 Django 中创建一个自定义表单字段,以允许用户链接文件或上传文件。为此,我正在创建 MultiValueField 的子类,其中 fields 属性设置为 (URLField(), FileField())。我不确定这是不是正确的方法,但我不断收到一个我无法理解的错误:

'MyFileField' object has no attribute 'attrs'

这是我的代码。谁能解释发生了什么?

from django import forms
from django.core.exceptions import ValidationError
from .models import Case, Person, Opp, Category


class MyFileField(forms.MultiValueField):
    def compress(self, data_list):
        # I'll get to this once the attr error goes away
        pass

    def __init__(self, *args, **kwargs):
        fields = (
            forms.URLField(), forms.FileField()
        )
        super(MyFileField, self).__init__(fields=fields, *args, **kwargs)

class CaseForm(forms.ModelForm):
    class Meta:
        model = Case
        fields = ['title', 'file', 'categories']
        widgets = 
            'file': MyFileField
        

【问题讨论】:

你不应该在这一行定义 attrs 吗? file': MyFileField 例如file': MyFileField(attrs=.....) 当我这样做时,我得到了错误:__init__() got an unexpected keyword argument 'attrs' 【参考方案1】:

问题是您在抽象类上调用 init

 super(MyFileField, self).__init__(fields=fields, *args, **kwargs)

但是基类是抽象的。

看https://docs.djangoproject.com/en/1.8/ref/forms/fields/#multivaluefield

Python's super(), abstract base classes, and NotImplementedError

【讨论】:

看完以上参考资料,我还是一头雾水。在您提供的 Django 文档链接中,代码示例调用 super() 的方式与您建议的问题相同:super(PhoneField, self).__init__( error_messages=error_messages, fields=fields, require_all_fields=False, *args, **kwargs))

以上是关于自定义 Django 小部件/字段:对象没有属性“attrs”的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin:仅对一个模型字段使用自定义小部件

动态自定义 django 表单小部件

如何在 Django 字段中使用多个小部件?

自定义 Django 模型字段中的“对象没有属性”

自定义 django 小部件 - decompress() arg 未填充

无法将 onTap 字段传递给无状态小部件