/ / Ich brauche ein "rohe ID" Widget für ein ModelMultipleChoiceField - django, django-forms, django-admin

Ich brauche ein "rohe ID" Widget für ein ModelMultipleChoiceField - django, django-forms, django-admin

eines meiner Modelle hat eine Viel zu viel Feld. Ich benutze ein ModelMultipleChoiceField mit dem Standard-Widget (Wählen Sie Mehrfach Widget) im Formular.

Das Problem: Es gibt ungefähr 50k Optionen für dieses Feld und es dauert ewig zu laden.

Ich möchte das Widget in CharField ändern und jedes PK getrennt durch ein Komma eingeben (wie das Admin-Feld raw_id_field).

Fragen: Was ist der beste Ansatz dafür? Hat jemand schon ein Widget dafür gemacht? Shoul Ich erstelle mein eigenes Widget oder Field?

Vielen Dank!

Antworten:

1 für die Antwort № 1

Wenn Sie keine Auswahl von Elementen in einem separaten Fenster benötigen, wie in admin, dann ist das Schreiben eines solchen Widgets sehr einfach. Mit dem folgenden Widget können Sie eine durch Kommas getrennte Liste von PKs eingeben:

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

Normalerweise würden Sie dieses Widget wie folgt verwenden:

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

0 für die Antwort № 2

Hast du es versucht ManyToManyRawIdWidget?

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

Disclaimer: Haven "t versuchte es selbst, stieß während des Grabens darauf durch den Quellcode für etwas anderes.