Django - 自定义小部件 - 为什么Django认为我没有'attrs'?

时间:2013-03-22 09:06:20

标签: django django-widget

编辑:使用Django 1.3

我已经构建了一个自定义小部件来教育自己,但我无法解决在提取页面时遇到的问题Django说:

'FooTestWidget' object has no attribute 'attrs'

我不想使用'attrs'参数,我将它设置为默认为None(也试过一个空字典,例如{})所以我很困惑为什么Django抱怨。

widgets.py

class FooTestWidget(Widget):
    """
    A very silly widget to test I can do anything
    """
    def __init__(self, attrs=None):
        pass

    def render(self, name, value, attrs=None):
        tpl = Template(u"""<h1>This is here instead of a CharField</h1>""")
        return mark_safe(tpl.substitute(colour=value))

admin.py

class UserAdminForm(ModelForm):
    class Meta:
        model = User
        widgets = {
                'name_family': FooTestWidget,
        }

class UserAdmin(admin.ModelAdmin):
    form = UserAdminForm

model.py

class User(models.Model):
    id = models.AutoField(primary_key=True, db_column='USE_ID')
    name_given = models.CharField(max_length=200, db_column='USE_NAME_GIVEN')
    name_family = models.CharField(max_length=200, db_column='USE_NAME_FAMILY')

丹尼尔帮助后的工作版

这是widgets.py的一个工作版本,他接受了Daniel在他的回答中解释的内容,然后我做了一两个其他的小改动(没有与这里描述的问题相关但是阻止了它的工作,因为它应该)。这个版本现在按照我的预期工作:

from datetime import date
import re

from django.forms.widgets import Widget, Select
from django.utils.safestring import mark_safe
from django.forms import widgets
from django.template.base import Template

__all__ = ('FooTestWidget',)

RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$')

class FooTestWidget(Widget):
    """
    A very silly widget to test I can do anything
    """
    #def __init__(self, attrs={}):
    #    pass

    def render(self, name, value, attrs=None):
        sout = u"""<h1>This is here instead of a CharField</h1>"""
        return mark_safe(sout)

1 个答案:

答案 0 :(得分:4)

麻烦的是你用一种什么都不做的方法覆盖了__init__。由于您甚至没有调用超类方法,因此Django所期望的任何设置都不会发生:包括将attrs参数设置为self.attrs属性。

基本上,如果你真的必须覆盖__init__,那么至少在某处调用super(FooTestWidget, self).__init__(attrs)。但是,如果您在该方法中没有做任何特殊操作,最好不要覆盖它,并自动使用super方法。