#1 by martin
Hi everyone, I have an IntegerField for which I require response (blank!=True). When no answer is provided, an error message pops up on top of the first choice of the unanswered field. I attach an image of that behavior. I would like the pop-up to not signal a specific choice. Ideally, flagging the whole question or the whole set of answers. Is there any way of doing so? I include the main pieces of the code: class Player(BasePlayer): best = models.IntegerField( choices=[[0, 'Strongly Disagree'], [1, 'Disagree'], [2, 'Neither Agree nor Disagree'], [3, 'Agree'], [4, 'Strongly Agree']], widget=widgets.RadioSelect ) {{ block content }} <b>Answer the following question:</b> <br> <div class="card"> <div class=card-header><b>Do you agree?</b></div> <div class="card-body"> {{ formfield 'agree' label=''}} </div> </div> <br> <button class="otree-btn-next">Next</button> {{ endblock }}
#2
by
BonnEconLab
(edited )
Here is an idea: In __init__.py, include class Player(BasePlayer): agree = models.IntegerField( choices=[ [0, 'Strongly Disagree'], [1, 'Disagree'], [2, 'Neither Agree nor Disagree'], [3, 'Agree'], [4, 'Strongly Agree'], ], widget=widgets.RadioSelect, initial=99, blank=True, ) as well as something like the following: class MyPage(Page): form_model = 'player' form_fields = ['agree'] def agree_error_message(player, value): if value not in [0, 1, 2, 3, 4]: return 'You have to select one of the options.' If a participant does not select any of the radio buttons, this will show a hint as shown in the attached screenshot. (Based on https://www.otreehub.com/forum/183/.)
#3
by
BonnEconLab
Based on an older post (https://www.otreehub.com/forum/1041/), here is some code that you could include in your HTML template to customize the highlighting of the input that has been missed by the participant: <style> .otree-form-errors { display: none; /* Hide the global error message */ } </style> <div class="card"> <div class=card-header><b>Do you agree?</b></div> <div class="card-body"> <div {{ if "agree" in form.errors }} class="border border-danger px-3 rounded" {{ endif }}> {{ formfield "agree" }} </div> </div> </div>
#4 by martin
Thanks, that is a good solution!
#5
by
BonnEconLab
I’m glad I could help. I just realized, by the way, that this also works without `initial=99`.
#6 by martin
True, thanks!