Aggiungi dinamicamente campi modulo in base ai risultati della query
-
20-12-2019 - |
Domanda
Ho un modello Question
che detiene un elenco di domande.Per i risultati della query in questa tabella vorrei creare un charfield.Questo è il mio tentativo iniziale che non ha alcun errore, ma nulla visualizzato:
def __init__(self, **kwargs):
super(QuestionnaireForm, self).__init__(**kwargs)
self.fields['questionnaire'] = dict()
questions = Question.objects.all()
for question in questions:
self.fields['questionnaire']['question' + str(question.pk)] = forms.CharField(widget=forms.TextInput(attrs=dict(placeholder=_("Answer"))), label=_(question))
.
E nel mio modello sto provando:
<div class="questionnaire">
<h2>{% trans "Questionnaire" %}</h2>
{% if form.questionnaire %}
{% for question in form.questionnaire %}
<div class="row">
{% include "core/includes/field.html" with field=question %}
</div>
{% endfor %}
{% endif %}
</div>
.
Nella mia uscita resa, vedo semplicemente:
<div class="questionnaire">
<h2>Questionnaire</h2>
</div>
.
Se eseguo logger.debug(self.fields['questionnaire'])
dopo averli impostarli in Form.__init__
, vedo:
DEBUG {'question1': <django.forms.fields.CharField object at 0x7ff76473d550>, 'question3': <django.forms.fields.CharField object at 0x7ff76473d990>, 'question2': <django.forms.fields.CharField object at 0x7ff76473d890>}
. Soluzione
Prova questo in vostra vista
def myview(request):
questions = Question.objects.all()
if request.method == 'POST':
form = MyForm(request.POST, extra=questions)
if form.is_valid():
pass
else:
form = MyForm(extra=questions)
return render(request, "template", { 'form': form})
.
in forme.py
class MyForm(forms.Form):
def __init__(self, *args, **kwargs):
extra = kwargs.pop('extra')
super(LoginForm, self).__init__(*args, **kwargs)
for question in extra:
self.fields['question_%s' % extra.id] = forms.CharField(widget=forms.TextInput())
.
Inizialmente la nostra forma con i campi extra che passiamo in argomento
Formets: per il tuo caso puoi definire un'altra domanda modulo:
class QuestionForm(forms.Form):
question = forms.CharField()
.
Vista:
def myview(request):
questions_rows = Question.objects.all().count()
QuestionFormSet = formset_factory(QuestionForm,extra=questions_rows)
if request.method == 'POST':
myform = LoginForm(request.POST,prefix='myform')
questions = QuestionFormSet(request.POST,prefix='question')
if myform.is_valid() and questions.is_valid():
pass
else:
myform = LoginForm(prefix='myform')
questions = QuestionFormSet(prefix='question')
return render(request, "template", { 'myform': myform,'questions':questions})
.
Puoi vedere che lavoriamo con molteplici forme (MyForm Semplice forma e domande sono formicabili per aggiungere campi interrogativi dinamicamente) Puoi controllare Formets