有什么方法可以将变量传递给 django meta class?

Any way to pass a variable into a django meta class?

我正在开发一个允许用户在地图上创建点的 Django 应用程序。为了便于使用,这张地图需要以某个位置为中心,而这个位置是可变的。我正在使用 LeafletWidget 让用户创建这个点。

地图可以通过改变 LeafletWidget 的属性来居中。不幸的是,这个小部件是在 Meta class 中定义的,据我所知,您不能将变量传递给它。这是我想做的一个例子,以某种方式将变量 center 传递给 Meta class。 center 是一个包含纬度和经度值的元组。这个示例代码当然不起作用。我不知道你是否能以某种方式将变量传递给 Meta class.

class PointModelForm(ModelForm):
    class Meta(center):
        model = PointModel
        fields = ['name', 'point']
        widgets = {'point': LeafletWidget(attrs={'settings_overrides': {'DEFAULT_CENTER': center} })}

我最好的选择是在 __init__ 函数中定义 widgets 属性,但是如果我是正确的,Meta classes 无法访问这些属性。当我 运行 这没有使用小部件。

class PointModelForm(ModelForm):
    class Meta:
        model = PointModel
        fields = ['name', 'point']

    def __init__(self, center):
        super(PointModelForm, self).__init__()
        self.widgets = {'point': LeafletWidget(attrs={'settings_overrides': {'DEFAULT_CENTER': center} })}

你知道怎么做吗?提前致谢!

您可以指定小部件的属性:

class PointModelForm(ModelForm):
    class Meta:
        model = PointModel
        fields = ['name', 'point']

    def __init__(self, *args, center=None, **kwargs):
        super(PointModelForm, self).__init__(*args, **kwargs)
        if center is not None:
            attrs = self.fields['point'].widget.attrs
            subattrs = attrs.setdefault('settings_overrides', {})
            <b>subattrs['DEFAULT_CENTER'] = center</b>

然后您可以构造一个 PointModelForm

PointModelForm(<b>center=(55, 12)</b>)  # for GET request
PointModelForm(request.POST, request.FILES<b>, center=(55, 12)</b>)  # for POST request