我需要模型多选字段的"raw id"小部件



我的一个模型有一个多对多字段。我正在使用一个模型多选字段,在表单上带有默认小部件(选择多个小部件)。

问题:这个字段大约有 50k 个选项,加载需要很长时间。

我想将小部件更改为 CharField 并输入每个用逗号分隔的 PK(如管理员raw_id_field)。

问题:最好的方法是什么?有人已经为此做了一个小部件吗?我应该创建自己的小部件或字段吗?

谢谢!

如果您不需要像在 admin 中那样在单独的窗口中选择项目,那么编写这样的小部件非常简单。使用以下小部件,您将能够输入逗号分隔的 pks 列表:

from django import forms
from django.utils.encoding import force_text
class ModelMultiRawInput(forms.TextInput):
    def render(self, name, value, attrs=None):
        if value:
            value = ','.join([force_text(v) for v in value])
        else:
            value = ''
        return super(ModelMultiRawInput, self).render(name, value, attrs)
    def value_from_datadict(self, data, files, name):
        value = data.get(name)
        if value:
            return value.split(',')

您通常会像这样使用此小部件:

class MyForm(forms.Form):
    users = forms.ModelMultipleChoiceField(queryset=User.objects.all(), widget=ModelMultiRawInput)

你试过ManyToManyRawIdWidget吗?

https://github.com/django/django/blob/master/django/contrib/admin/widgets.py#L205

免责声明:我自己没有尝试过,在挖掘源代码寻找其他东西时遇到了它。

最新更新