我的一个模型有一个多对多字段。我正在使用一个模型多选字段,在表单上带有默认小部件(选择多个小部件)。
问题:这个字段大约有 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
免责声明:我自己没有尝试过,在挖掘源代码寻找其他东西时遇到了它。