使用Javascript逐个添加Django MultipleChoiceField
我正在基于以下表格编写Django视图:使用Javascript逐个添加Django MultipleChoiceField,javascript,django,Javascript,Django,我正在基于以下表格编写Django视图: class MyForm(forms.Form): def __init__(self, data, examen, *args, **kwargs): super(MyForm, self).__init__(data, *args, **kwargs) self.fields['q1'] = forms.MultipleChoiceField( label=mark_safe(
class MyForm(forms.Form):
def __init__(self, data, examen, *args, **kwargs):
super(MyForm, self).__init__(data, *args, **kwargs)
self.fields['q1'] = forms.MultipleChoiceField(
label=mark_safe("Label question 1"),
required=True,
widget=forms.CheckboxSelectMultiple,
choices=(('1', 'answer 1'), ('2', 'answer 2'), ('3', 'answer 3'))
)
self.fields['q2'] = forms.MultipleChoiceField(
label=mark_safe("Label question 2"),
required=True,
widget=forms.CheckboxSelectMultiple,
choices=(('1', 'answer 4'), ('2', 'answer 5'), ('3', 'answer 6'))
)
... #TODO : add questions q3 to q9
self.fields['q10'] = forms.MultipleChoiceField(
label=mark_safe("Label question 10"),
required=True,
widget=forms.CheckboxSelectMultiple,
choices=(('1', 'answer 28'), ('2', 'answer 29'), ('3', 'answer 30'))
)
我想用一个[submit]按钮在单个视图上显示自己的字段['q1']。用户可以选择他认为正确的答案,然后点击[submit]按钮。此后,self.fields['q1']
将变为只读,self.fields['q2']
将在下方再次显示一个[submit]按钮。。。和子,直到self.fields['q10']
我相信实现这一点的唯一方法是使用Javascript(甚至JQuery或任何其他库)。问题是我对Javascript不是很熟悉,我很乐意得到一些关于如何解决这个问题的提示
谢谢你所做的一切
PS:如果你认为这不是实现我目标的正确方式,我很高兴改变我的Django设计
编辑2019年11月29日:我当前的模板如下所示:
<form action="{% url 'quizz' my_exam %}" method="post">
{% csrf_token %}
{% for field in form %}
{% ifequal forloop.counter0 0 %}
<div class="card text-white bg-primary mb-3">
<div class="card-body">
<h6 class="card-title">{{ field.label|linebreaksbr }}</h6>
</div>
</div>
{% else %}
<div class="card">
<h5 class="card-header">{{field.name}}</h5>
<div class="card-body">
<h6 class="card-title">{{ field.label|linebreaksbr }}</h6>
<p class="card-text">{{ field }}</p>
</div>
</div>
{% endifequal %}
{% endfor %}
<input type="submit" value="Submit" class="btn btn-primary"/>
</form>
{%csrf_令牌%}
{%形式的字段为%}
{%ifequalforloop.counter0%}
{field.label | linebreaksbr}}
{%else%}
{{field.name}
{field.label | linebreaksbr}}
{{field}
{%endifequal%}
{%endfor%}
编辑2019年11月30日:基于@Phanti建议的新模板:
<script>
{% block jquery %}
$("#submit_2").click(function() {
$("#questions_container").find(":hidden").show().next();
}
{% endblock %}
</script>
{% block content %}
<form action="{% url 'quizz' exam %}" method="post">
{% csrf_token %}
<div id="questions_container">
{% for field in form %}
{% ifequal forloop.counter 1 %}
<div class="card text-white bg-primary mb-3">
<div class="card-body">
<h6 class="card-title">{{ field.label|linebreaksbr }}</h6>
</div>
</div>
{% else %}
{% ifequal forloop.counter 2 %}
<div id="question_{{ forloop.counter }}" class="card" style="display: block;">
<h5 class="card-header">{{field.name}}</h5>
<div class="card-body">
<h6 class="card-title">{{ field.label|linebreaksbr }}</h6>
<p class="card-text">{{ field }}</p>
</div>
</div>
<input id="submit_{{ forloop.counter }}" value="Valider" class="btn btn-primary" style="display: block;"/>
{% else %}
<div id="question_{{ forloop.counter }}" class="card" style="display: none;">
<h5 class="card-header">{{field.name}}</h5>
<div class="card-body">
<h6 class="card-title">{{ field.label|linebreaksbr }}</h6>
<p class="card-text">{{ field }}</p>
</div>
</div>
{% if not forloop.last %}
<input id="submit_{{ forloop.counter }}" value="Submit" class="btn btn-primary" style="display: none;"/>
{% else %}
<input id="submit_{{ forloop.counter }}" type="submit" value="Submit" class="btn btn-primary" style="display: none;"/>
{% endif %}
{% endifequal %}
{% endifequal %}
{% endfor %}
</div>
</form>
{% endblock %}
{%block jquery%}
$(“#提交_2”)。单击(函数(){
$(“#问题_容器”).find(“:hidden”).show().next();
}
{%endblock%}
{%block content%}
{%csrf_令牌%}
{%形式的字段为%}
{%ifequal forloop.counter 1%}
{field.label | linebreaksbr}}
{%else%}
{%ifequal forloop.counter 2%}
{{field.name}
{field.label | linebreaksbr}}
{{field}
{%else%}
{{field.name}
{field.label | linebreaksbr}}
{{field}
{%if不是forloop.last%}
{%else%}
{%endif%}
{%endifequal%}
{%endifequal%}
{%endfor%}
{%endblock%}
你的模板是什么样子的?使用JS,你可以在默认情况下隐藏q2-q10元素,除非用户选择/回复q1等等。@Phanti谢谢你的回答。我刚刚添加了我的html模板。这可能是一个虚拟问题,但你会如何隐藏?你可以为每个表单分配唯一的html ID。然后使用JS/jQue我需要进一步操作如何显示表单的逻辑。这包括几种不同的技术/语言。@Phanti我认为只有在字段最多为'q10'的情况下它才有效吗?例如,如果我想将表单升级到'q12',我需要更新我的html,对吗?您是否有一个片段或到教程的链接做这些类型的操作,这样我就可以尝试使它适应我的目标?谢谢。不用担心,你也可以在JS中使用循环。你的模板是什么样子的?使用JS,你可以默认隐藏q2-q10元素,除非用户选择/回复q1等等。@Phanti谢谢你的回答。我刚刚添加了我的html模板。它可能是一个d嗯,我的问题是,但是你会如何隐藏?你可以为每个表单分配唯一的html ID。然后使用JS/jQuery进一步操作如何显示表单的逻辑。这包括几种不同的技术/语言。@Phanti我认为只有在字段最多为'q10'时它才有效吗?例如,如果我t要将我的表单升级到'q12',我需要更新我的html,对吗?你是否有一个片段或一个到教程的链接来进行这些操作,以便我可以尝试将其调整到我的目标?谢谢。不用担心,你也可以在JS中使用循环。