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 № 1Se 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.