1

編集:Django1.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の動作バージョンを次に示します。次に、他に1つまたは2つの小さな変更を加えました(ここで説明する問題には関連付けられていませんでしたが、正常に動作しなくなりました)。このバージョンは、期待どおりに機能するようになりました。

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)
4

1 に答える 1

4

__init__問題は、何もしないメソッドでオーバーライドしたことです。スーパークラスメソッドを呼び出さないため、Djangoが期待するセットアップは発生しません。attrsパラメーターをself.attrs属性に設定することも含まれます。

基本的に、本当にオーバーライドする必要がある場合__init__は、少なくともsuper(FooTestWidget, self).__init__(attrs)どこかで呼び出します。ただし、そのメソッドで特別なことを何もしていない場合は、オーバーライドせずに、superメソッドを自動的に使用することをお勧めします。

于 2013-03-22T10:03:57.803 に答える