私はDjango用のより良い/より強力なフォームクラスを構築しようとしています。これらのサブフォームを除いて、うまく機能しています。実際には、apacheを再起動した直後は完全に機能しますが、ページを数回更新すると、HTML出力は次のようになります。
<input class="text" type="text" id="pickup_addr-pickup_addr-pickup_addr-id-pickup_addr-venue" value="" name="pickup_addr-pickup_addr-pickup_addr-pickup_addr-venue" />
pickup_addr-
パーツは何度も繰り返され始めます。これを引き起こす可能性のあるコードのループを探していましたprefix
が、ページを更新したときに出力が一貫していないため、どこかにキャッシュされていると思いますが、それがどのように可能か想像さえできません。クラスが初期化されたprefix
ときに変数をリセットする必要がありますね。どういうわけか何かを初期化していないのでなければ?
class Form(object):
count = 0
def __init__(self, data={}, prefix='', action='', id=None, multiple=False):
self.fields = {}
self.subforms = {}
self.data = {}
self.action = action
self.id = fnn(id, 'form%d' % Form.count)
self.errors = []
self.valid = True
if not empty(prefix) and prefix[-1:] not in ('-','_'): prefix += '-'
for name, field in inspect.getmembers(self, lambda m: isinstance(m, Field)):
if name[:2] == '__': continue
field_name = fnn(field.name, name)
field.label = fnn(field.label, humanize(field_name))
field.name = field.widget.name = prefix + field_name + ife(multiple, '[]')
field.id = field.auto_id = field.widget.id = ife(field.id==None, 'id-') + prefix + fnn(field.id, field_name) + ife(multiple, Form.count)
field.errors = []
val = fnn(field.widget.get_value(data), field.default)
if isinstance(val, basestring):
try:
val = field.coerce(field.format(val))
except Exception, err:
self.valid = False
field.errors.append(escape_html(err))
field.val = self.data[name] = field.widget.val = val
for rule in field.rules:
rule.fields = self.fields
rule.val = field.val
rule.name = field.name
self.fields[name] = field
for name, form in inspect.getmembers(self, lambda m: ispropersubclass(m, Form)):
if name[:2] == '__': continue
self.subforms[name] = self.__dict__[name] = form(data=data, prefix='%s%s-' % (prefix, name))
Form.count += 1
さらにコードが必要な場合はお知らせください...たくさんあることはわかっていますが、これを引き起こしている原因がわかりません。キャッシュミドルウェアも使用していません。
最初にフィールドをコピー/クローンすると、代わりに次の出力が表示されます。
<label for="None">None</label>
<input class="text" type="text" id="id-pickup_address-venue" value="" name="pickup_address-venue" />
field.name
とfield.label
はまったく同じように設定されます...実際にfield.id
は正しく表示されます<input>
が、ラベルを印刷しようとすると同じ値が突然消えてしまいます....違いは、<input>
ビットがWidget
クラスによって印刷されるのに対し、これlabel
は私のテンプレートから直接印刷されます...私は推測します...ああ、私はそれを理解しました、それはまだインスタンスフィールドではなく未設定のクラスレベル/静的フィールドを参照しています...