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