有啥方法可以将变量传递给 django 元类?

Posted

技术标签:

【中文标题】有啥方法可以将变量传递给 django 元类?【英文标题】:Any way to pass a variable into a django meta class?有什么方法可以将变量传递给 django 元类? 【发布时间】:2020-12-02 11:43:40 【问题描述】:

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

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

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

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

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 )

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

【问题讨论】:

【参考方案1】:

您可以使用以下命令指定小部件的属性:

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', )
            subattrs['DEFAULT_CENTER'] = center

然后您可以使用以下命令构造PointModelForm

PointModelForm(center=(55, 12))  # for GET request
PointModelForm(request.POST, request.FILES, center=(55, 12))  # for POST request

【讨论】:

我不知道您可以以这种方式定义属性。非常感谢您的有用回答!

以上是关于有啥方法可以将变量传递给 django 元类?的主要内容,如果未能解决你的问题,请参考以下文章

将 django 变量传递给 javascript

在类似 django 的表单实现中使用元类有啥好处?

使用 jquery 将模板变量传递给 django url

有没有办法将变量传递给 Django 中的“扩展”模板?

使用 Ajax 方法将变量传递给 python

如何将变量传递给自定义 Django 模板加载器?