/ / Preciso de um widget "raw id" para um ModelMultipleChoiceField - django, django-forms, django-admin

Eu preciso de um widget "raw id" para um ModelMultipleChoiceField - django, django-forms, django-admin

um dos meus modelos tem um Muitos para muitos campo. Eu estou usando um ModeloMultipleChoiceField com o widget padrão (SelecioneMultiple widget) no formulário.

O problema: Existem cerca de 50 mil opções para este campo e está demorando para carregar.

Eu quero mudar o widget para CharField e digite cada PK separado por uma vírgula (como o admin raw_id_field).

Questões: Qual é a melhor abordagem para fazer isso? Alguém já fez um widget para isso? Eu criei meu próprio widget ou campo?

Obrigado!

Respostas:

1 para resposta № 1

Se você não precisa selecionar itens em uma janela separada, como em admin, então escrever tal widget é bastante simples. Com o seguinte widget, você poderá inserir uma lista separada por vírgulas de 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(",")

Você normalmente usaria esse widget assim:

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

0 para resposta № 2

Você tentou ManyToManyRawIdWidget?

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

Disclaimer: Haven "t tentou eu mesmo, veio em frente enquanto cavando através do código-fonte para outra coisa.