Pregunta

Tengo un modelo Question que sostiene una lista de preguntas.Por los resultados de consultar esta tabla, me gustaría crear un CHARFIELD.Este es mi intento inicial que resulta en ningún error, pero nada se muestra:

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))

y en mi plantilla estoy intentando:

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

En mi salida renderizada, simplemente veo:

<div class="questionnaire">
    <h2>Questionnaire</h2>
</div>

Si ejecuto logger.debug(self.fields['questionnaire']) después de configurarlos en Form.__init__, veo:

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

¿Fue útil?

Solución

Pruebe esto en su 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}) 

en formularios.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())

inicial de nuestro formulario con los campos adicionales que pasamos en argumento

Formas: Para su caso, puede definir otra pregunta de forma:

class QuestionForm(forms.Form):
    question = forms.CharField()

Ver:

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

Puede ver que trabajamos con múltiples formularios (MyForm Simple Form y Preguntas son Formies para agregar campos de pregunta dinámicamente) Puede verificar FREFETS

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top