Django-自定义小部件-为什么Django认为我没有“属性”?
编辑:使用Django 1.3 我已经构建了一个自定义小部件来教育自己,但我无法克服一个问题,即当获取页面时,Django说:Django-自定义小部件-为什么Django认为我没有“属性”?,django,django-widget,Django,Django Widget,编辑:使用Django 1.3 我已经构建了一个自定义小部件来教育自己,但我无法克服一个问题,即当获取页面时,Django说: 'FooTestWidget' object has no attribute 'attrs' 我不想使用'attrs'参数,我已经将它设置为默认值None,还尝试了一个空字典,例如{},所以我不明白Django为什么抱怨 widgets.py model.py DANIEL帮助后的工作版本 这是widgets.py的一个工作版本,它接受了Daniel在回答中解释的内
'FooTestWidget' object has no attribute 'attrs'
我不想使用'attrs'参数,我已经将它设置为默认值None,还尝试了一个空字典,例如{},所以我不明白Django为什么抱怨
widgets.py
model.py
DANIEL帮助后的工作版本
这是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)
问题是你已经用一个什么都不做的方法覆盖了_uinit_uuuu。由于您甚至不调用超类方法,Django所期望的任何设置都不会发生:包括将attrs参数设置为self.attrs属性
基本上,如果你真的必须重写uuu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是,如果您在该方法中没有做任何特殊的操作,最好不要重写它,让超级方法自动使用。问题是您已经用一个不做任何操作的方法重写了u init。由于您甚至不调用超类方法,Django所期望的任何设置都不会发生:包括将attrs参数设置为self.attrs属性
基本上,如果你真的必须重写uuu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是,如果你在这个方法中没有做什么特别的事情,最好不要覆盖它,让超级方法自动使用。@catherine-谢谢你的评论。我同意错误信息是相同的,但实际上情况不同,是吗?。我的意思是没有一个自定义的小部件涉及和op似乎有混淆的领域和小部件?我很高兴被纠正,但就我所知,错误消息的文本是连接这两者的唯一东西?再次感谢。是的,不一样了。我只是想让你知道为什么会发生这种错误。我认为你犯了这个错误是因为你把它wrong@catherine-谢谢你的评论。我同意错误信息是相同的,但实际上情况不同,是吗?。我的意思是没有一个自定义的小部件涉及和op似乎有混淆的领域和小部件?我很高兴被纠正,但就我所知,错误消息的文本是连接这两者的唯一东西?再次感谢。是的,不一样了。我只是想让你知道为什么会发生这种错误。我认为你犯了这个错误,因为你把它弄错了,非常感谢。这让我可以让它工作,我已经把工作版本在上面的编辑问题,为了未来的搜索。正如你可能已经猜到的,我一直在尝试很多东西,而只包含“pass”的init是我后来忘记的迭代之一!再次感谢,非常感谢。这让我可以让它工作,我已经把工作版本在上面的编辑问题,为了未来的搜索。正如你可能已经猜到的,我一直在尝试很多东西,而只包含“pass”的init是我后来忘记的迭代之一!再次感谢,非常感谢。
class UserAdminForm(ModelForm):
class Meta:
model = User
widgets = {
'name_family': FooTestWidget,
}
class UserAdmin(admin.ModelAdmin):
form = UserAdminForm
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')
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)