oTree Forum >

Add a percent sign (%) after an input box in the survey

#1 by MinFang (edited )

Hi there, 

I plan to ask subjects to enter an integer ranging from 0 to 100 in a survey question. In this question, I want to add a percent sign (%) after the input box. How do I achieve this?

Let's say in class player, we have
q_belief=models.IntegerField(blank=True, min=0, max=100)

and q_belief is called in the survey page.

What to do to customize {{ formfield player.q_belief }}, so that the input box displayed as "[_________]%"?

Thank you for any help!

#2 by BonnEconLab

Try including this in your HTML template instead of {{ formfield player.q_belief }}:

<div class="input-group input-group-narrow">
  <input type="number" class="form-control" id="id_q_belief" name="q_belief" value="" min="0" max="100" step="1">
  <span class="input-group-text">%</span>
</div>
{{ formfield_errors 'q_belief' }}

See https://otree.readthedocs.io/en/latest/forms.html?highlight=html#raw-html-widgets. The crucial aspect is that the input’s name attribute has to equal the name of the player field in your Python code (__init__.py).

#3 by MinFang

Thank you for your reply!

I followed your suggestion and I got the input box with a percent sign on my page. 

But when I input an integer and click the next button to submit this page, the input box becomes empty and the value I entered before was not saved.

Could you please help me to fix this followed-up problem?

Thank you again for your helpful suggestions!

#4 by BonnEconLab

Well, troubleshooting without knowing your code is difficult ...

I can only venture a guess: Maybe you forgot a to include form_fields in your page class?

That is,

class YourSurveyPage(Page):

    form_model = 'player'
    form_fields = ['q_belief']

See https://otree.readthedocs.io/en/latest/forms.html.

Or you may have misspelled the name of the field in your HTML code.

#5 by MinFang

Sorry I didn't make my problem clear.

I just checked myt code and I indeed include form_fields in the page class and there is no misspelling.

Here is a simplified version of my code:
------------------------------------
[__init__.py]
------------------------------------
class Player(BasePlayer):
    q_belief= models.IntegerField(
    blank=True,
    min=0, max=100
    )
    
class Questionnaire(Page):
    form_model = 'player'
    form_fields = [['q_belief']
----------------------------------
[Questionnaire.html]
----------------------------------
{% extends "global/Page.html" %}
{% load otree static %}

{% block title %}
    Questionnaire
{% endblock %}

<div class="input-group input-group-narrow">
  <input type="number" class="form-control" id="id_q_belief" name="q_belief" value="" min="0" max="100" step="1">
  <span class="input-group-text">%</span>
</div>
<p>(Please enter an integer ranging from 0 to 100.)</p>
{{ formfield_errors 'q_belief' }}

    {% next_button %}

{% endblock %}

Look forward to your reply! 
Many thanks!

#6 by MinFang

There is a typo in the sample code I just uploaded:

form_fields = [['q_belief'] --> form_fields = ['q_belief']

In the text editor, it is right.

#7 by MinFang

I find that your reply in #2 has already solvesd my problem! There are lines of code that I comment out in the html file, which lead to the sumbit error I mentioned earlier (still don't know why, but it doesn't matter). Once I delete them, the code works well!

I really appreciate your help!

Write a reply

Set forum username