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>}
.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top