#1 by sried
Hi everyone! I noticed that the "forminputs.xyz.required = true" does not work with widgets.RadioSelect because for each choice a single input field is created in HTML. Is there a workaround to use the convenience of forminputs with RadioSelect as well or is the only option to set required = true through more extensive JS, picking all input fields by ID? In the MWE below, the "forminputs.income_other_specific.required = true;" works perfectly fine while "forminputs.current_work.required = true;" does not work. The participant can advance without providing any answer to this question. Any ideas or workarounds? Here is an MWE: __init__.py: ...... class Player(BasePlayer): income_work = models.IntegerField(min=0, label="Income from work?") income_other = models.IntegerField(min=0, label="Other income source?") income_other_specific = models.StringField( label='Please specify this income source.', blank=True, ) current_work = models.IntegerField( label="Are you unemployed at the moment?", choices=[ [1, "Yes"], [2, "No"] ], widget=widgets.RadioSelect, blank=True, ) class Page(Page): form_model = 'player' form_fields = ['income_work', 'income_other', 'income_other_specific', 'current_work'] Page.html: .... <div> <label for="income_work">Income from work?</label> <input name="income_work" id="income_work" type="number" onkeyup="show_inc_other_spec()"/> {{ formfield_errors "income_work" }} </div> <div> <label for="income_other">Other income source?</label> <input name="income_other" id="income_work" type="number" onkeyup="show_c_work()"/> {{ formfield_errors "income_other" }} </div> <div id="inc_other_spec"> {{ formfield "income_other_specific" }} {{ formfield_errors "income_other_specific"}} <br> </div> <div id="c_work"> {{ formfield "current_work" }} {{ formfield_errors "current_work" }} <br> </div> <script> function show_inc_other_spec () { let inc_other = document.getElementById('income_other').value; if (parseInt(inc_other)>0) { document.getElementById('inc_other_spec').style.display = 'block'; forminputs.income_other_specific.required = true; } else { document.getElementById('inc_other_spec').style.display = 'none'; forminputs.income_other_specific.required = false; } } function show_c_work () { let inc_work = document.getElementById('income_work').value; if (parseInt(inc_work)===0) { document.getElementById('c_work').style.display = 'block'; forminputs.current_work.required = true; } else { document.getElementById('c_work').style.display = 'none'; forminputs.current_work.required = false; } } </script>
#2
by
Chris_oTree
for (let radio of forminputs.current_work) { radio.required = false; } Also make sure you are updated to the latest oTree, because it will throw an error to alert when setting an invalid attribute on a forminput.