vera - dove è stato girato django unchained




Passare l'iniziale in ModelFormSet di Django (7)

Ho un formset del modello che ho bisogno di passare la parola chiave iniziale in (per avere alcuni valori iniziali nel formset, come ad esempio la data impostata su oggi). Per quanto posso dire, l'argomento queryset (che si imposta su YourModel.objects.all ()) sovrascrive questa capacità per la creazione di moduli iniziali vuoti. Ho specificato il queryset come: YourModel.objects.none (), che impedisce di compilare il formset con le voci del database, ma non riesco ancora a capire come passare l'iniziale in modo efficace. Devo creare una sottoclasse di un metodo da ModelForm?


È ancora possibile passare iniziale a ModelFormSet.

from django.forms.models import modelformset_factory
from example.models import ExampleModel

ExampleModelFormSet = modelformset_factory(ExampleModel)
formset = ExampleModelFormSet(initial=[{'name': 'Some Name'},
                                       {'name': 'Another Name'}])

Se questo non è il tuo dopo, puoi spiegare di più la tua domanda.

MODIFICARE:

ExampleModelFormSet = modelformset_factory(ExampleModel, extra=2)
formset = ExampleModelFormSet(queryset=ExampleModel.objects.none(),
                              initial=[{'name': 'Some Name'},
                                       {'name': 'Another Name'}])

È possibile modificare i dati iniziali in seguito.

Per esempio:

# Construct the FormSet class
ExampleFormSet = modelformset_factory(ParentModel, ChildModel)

# Set the initial data
initial_data = {'field1': 1}
for form in ExampleFormSet.extra_forms:
    for field in form.fields:
        field.initial = initial_data[field.name]

Il modo migliore che ho trovato per farlo è quello di regolare manualmente l'attributo "extra" dell'oggetto formset dopo l'inizializzazione. Questo è stato testato e funziona in Django 1.9.

ExampleModelFormSet = modelformset_factory(ExampleModel, extra=1)
formset = ExampleModelFormSet(initial=[{'name': 'Some Name'},
                                       {'name': 'Another Name'}])
formset.extra = 3

Questo sputerà 3 moduli (2 prepopolati e 1 vuoto).

Se vuoi qualcosa di più dinamico (es. L' initial è una variabile calcolata da qualche altra parte), puoi fare qualcosa del genere:

ExampleModelFormSet = modelformset_factory(ExampleModel, extra=1)
formset = ExampleModelFormSet(initial=initial)
formset.extra += len(initial)

Spero che sia d'aiuto.


Il modo semplice per passare i dati iniziali con lo stesso numero di moduli aggiuntivi:

MyModelFormSet = lambda *a, **kw: modelformset_factory(MyModel, extra=kw.pop('extra', 1))(*a, **kw)

Utilizzo in viste:

initial=[{'name': 'Some Name'},{'name': 'Another Name'}
formset = MyModelFormSet(queryset=MyModel.objects.none(), initial, extra=len(initial))})



Una soluzione semplice potrebbe essere quella di passare un modulo che estende un modelform () a un formset (anziché a modelformset).

In questo modo puoi impostare i valori iniziali nel modulo.