如何动态修改Django小部件参数?

2024-06-03 03:05:01 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样一个形式:

class ChangeParentCIForm(ModelForm):
    class Meta:
        model = CINodeInventory
        fields = ('parent',)
        widgets = {'parent': AutocompleteWidget('inventory.uuid'),}

问题是,在我的例子中,AutocompleteWidget内容不仅必须与“parent”字段值相关,还必须与用户会话信息(对我来说,是用户在另一个页面上选择的数据库版本号)相关

为此,我在基于类的视图中做了如下操作:

^{pr2}$

当然,我修改了AutocompleteWidget代码来处理这个“url_params”额外参数。在

它可以工作,但在我看来,这段代码并不是很漂亮,因为它修改了在初始化时为同样在初始化时生成的字段创建的小部件。 如果您创建了两个表单实例,它指向相同的字段和小部件,那么如果我这样做:

def get_form(self,form_class):
    form1 = super(CompanyManageChangeParentCIView,self).get_form(form_class)
    form2 = super(CompanyManageChangeParentCIView,self).get_form(form_class)
    form1.base_fields['parent'].widget.url_params="val1"
    form2.base_fields['parent'].widget.url_params="val2"
    print id(form1),id(form1.base_fields['parent'].widget)
    print id(form2),id(form2.base_fields['parent'].widget)

我们可以看到form1和form2指向不同的实例,但它们指向相同的小部件(如果打印它们的id,则指向相同的字段)。因此,对于我来说,如果我在同一个模板中显示form1和form2,我将显示2个widget“AutocompleteWidget”,但都是用最新修改定制的,即url_parms=“val2”

即使我显示一个表单,在我看来也很危险,如果两个线程在同一个小部件上用两个不同的“url_params”值执行相同的代码,会发生什么情况?在

所以我的问题是:如何使用上下文信息而不仅仅是相关字段值来定制django小部件呈现?在


Tags: 代码formidurlfieldsbase部件params
1条回答
网友
1楼 · 发布于 2024-06-03 03:05:01

因为您正在更改form.base_fields,它由类的所有实例共享。不要这样做,更改form.fields,这是特定于实例的。在

作为样式的问题,我更喜欢在表单本身的__init__方法中执行此操作,并将URL参数作为form kwarg传递-看起来您可以覆盖视图的get_form_kwargs方法来完成此操作,那么您根本不需要更改get_form。在

相关问题 更多 >