قم بإضافة حقول النموذج ديناميكيًا بناءً على نتائج الاستعلام
-
20-12-2019 - |
سؤال
لدي نموذج 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})
يمكنك أن ترى أننا نعمل مع نماذج متعددة (نموذجي البسيط والأسئلة عبارة عن مجموعات نماذج لإضافة حقول الأسئلة ديناميكيًا) يمكنك التحقق مجموعات النموذج
لا تنتمي إلى StackOverflow