/ / J'ai besoin d'un widget «identifiant brut» pour un ModelMultipleChoiceField - django, django-forms, django-admin

J'ai besoin d'un widget "raw id" pour un ModelMultipleChoiceField - django, django-forms, django-admin

un de mes modèles a un Plusieurs à plusieurs champ. J'utilise un ModelMultipleChoiceField avec le widget par défaut (SélectionnezMultiple widget) au formulaire.

Le problème: Il y a environ 50 000 options pour ce champ et cela prend beaucoup de temps à charger.

Je veux changer le widget à CharField et entrer chaque PK séparée par une virgule (comme l'admin raw_id_field).

Des questions: Quelle est la meilleure approche pour le faire? Est-ce que quelqu'un a déjà fait un widget pour cela? Devrais-je créer mon propre widget ou champ?

Merci!

Réponses:

1 pour la réponse № 1

Si vous n’avez pas besoin de sélectionner les éléments dans une fenêtre séparée, comme dans l’administrateur, écrire un tel widget est très simple. Avec le widget suivant, vous pourrez entrer une liste de points séparés par des virgules:

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

Vous devriez normalement utiliser ce widget comme ça:

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

0 pour la réponse № 2

As-tu essayé ManyToManyRawIdWidget?

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

Disclaimer: Haven "t essayé moi-même, est tombé dessus en creusant à travers le code source pour autre chose.