【问题标题】:Django - custom widget - why does Django think I don't have 'attrs'?Django - 自定义小部件 - 为什么 Django 认为我没有“属性”?
【发布时间】:2013-03-22 09:06:19
【问题描述】:

编辑:使用 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的工作版本,在接受丹尼尔在他的回答中解释的内容,然后我做了一两个其他小的改变(这与这里描述的问题无关,但它停止了它应该正常工作)。这个版本现在可以正常工作了:

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)

【问题讨论】:

  • @catherine - 感谢您的评论。我同意错误消息是相同的,但情况并不完全相同(是吗?)。我的意思是没有涉及自定义小部件,并且操作似乎有混淆的字段和小部件?我很高兴得到纠正,但据我所知,错误消息的文本是唯一将两者联系起来的东西?再次感谢。
  • 是的,它不一样。我只是想让你知道为什么会发生这个错误。我认为你犯了这个错误是因为你把它弄错了

标签: django django-widget


【解决方案1】:

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

基本上,如果你真的必须覆盖__init__,那么至少在某个地方调用super(FooTestWidget, self).__init__(attrs)。但是,如果你在那个方法中没有做任何特别的事情,最好不要重写它,让 super 方法自动使用。

【讨论】:

  • 非常感谢。这让我可以让它工作(为了将来的搜索者,我把工作版本放在上面的编辑问题中)。正如您可能已经猜到的那样,我一直在尝试很多事情,而仅包含“pass”的 init 是我忘记的那些迭代之一!再次感谢,非常感谢。
猜你喜欢
  • 2012-04-11
  • 2015-08-07
  • 2015-04-14
  • 2019-08-09
  • 2011-04-10
  • 1970-01-01
  • 2014-06-24
  • 2022-01-23
  • 2021-10-17
相关资源
最近更新 更多