قم بإضافة حقول النموذج ديناميكيًا بناءً على نتائج الاستعلام

StackOverflow https://stackoverflow.com//questions/25006976

سؤال

لدي نموذج Question الذي يحمل قائمة الأسئلة.للحصول على نتائج الاستعلام عن هذا الجدول أود إنشاء CharField.هذه هي محاولتي الأولى والتي لم ينتج عنها أي خطأ، ولكن لم يتم عرض أي شيء:

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

وفي القالب الخاص بي أحاول:

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

في مخرجاتي المقدمة أرى ببساطة:

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

إذا ركضت logger.debug(self.fields['questionnaire']) بعد وضعهم فيها Form.__init__ أرى:

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>}
هل كانت مفيدة؟

المحلول

جرب هذا من وجهة نظرك

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

في Forms.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())

قم بكتابة نموذجنا بالحقول الإضافية التي نمررها في الوسيطة

Formsets: لحالتك يمكنك تحديد نموذج آخر سؤال:

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

منظر:

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

يمكنك أن ترى أننا نعمل مع نماذج متعددة (نموذجي البسيط والأسئلة عبارة عن مجموعات نماذج لإضافة حقول الأسئلة ديناميكيًا) يمكنك التحقق مجموعات النموذج

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top