动态修改Django中的表单小部件

Rog*_*ger 4 django django-forms

我的Django应用程序使用Django Suit作为主题Django管理应用程序的工具.Suit可以做的事情之一是追加和预置元素以形成小部件,如:

class PropertyForm(ModelForm):
    class Meta:
        model = Property
        widgets = {
            'amount': EnclosedInput(prepend = "GBP"),
        }
Run Code Online (Sandbox Code Playgroud)

效果是:

在此输入图像描述

虽然这是一个很好的功能,但如果我可以动态添加它(如伪代码)会更有用:

'amount': EnclosedInput(prepend = my_model_instance.currency)
Run Code Online (Sandbox Code Playgroud)

我试图像这样覆盖表单的init:

class PropertyForm(ModelForm):

    def __init__(self, *args, **kwargs):
        inst = kwargs["instance"]
        self._meta.widgets["amount"] = EnclosedInput(prepend = inst.currency)
        super(PropertyForm, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,只有当我在init方法中放置断点时才有效.看起来有一些时间问题.

所以我的问题是实现这一目标的最佳方式(如果可以的话)是什么?

Rog*_*ger 10

问题在于:

self._meta.widgets["amount"] = EnclosedInput(prepend = inst.currency)
Run Code Online (Sandbox Code Playgroud)

事实证明_meta正在缓存.当我将上面的行更改为(这也是一个更好的解决方案,因为_meta可能是私有的):

self.fields['amount'].widget = EnclosedInput(prepend = inst.currency)
Run Code Online (Sandbox Code Playgroud)

......它完美无瑕