/ / Ho bisogno di un widget "raw id" per un ModelMultipleChoiceField - django, django-forms, django-admin

Ho bisogno di un widget "raw id" per un ModelMultipleChoiceField - django, django-forms, django-admin

uno dei miei modelli ha un ManyToMany campo. Sto usando un ModelMultipleChoiceField con il widget predefinito (selectMultiple widget) nella forma.

Il problema: Ci sono circa 50k opzioni per questo campo e ci vogliono anni per caricare.

Voglio cambiare il widget in CharField e inserire ogni PK separato da una virgola (come l'admin raw_id_field).

Domande: Qual è l'approccio migliore per farlo? Qualcuno ha già fatto un widget per questo? Shoul Creo il mio Widget o campo?

Grazie!

risposte:

1 per risposta № 1

Se non hai bisogno di selezionare gli elementi in una finestra separata, come in admin, scrivere questo widget è abbastanza semplice: con il seguente widget potrai inserire un elenco di pks separati da virgole:

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(",")

Normalmente utilizzerai questo widget in questo modo:

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

0 per risposta № 2

Hai provato ManyToManyRawIdWidget?

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

Disclaimer: Haven non l'ha mai provato, l'ha trovato mentre scavava attraverso il codice sorgente per qualcos'altro.