8

Which is the best way to create a django form field that accepts floats and has the same functionality as a NumberInput? What I mean with same functionality is that django's NumberInput has arrows right next to the input that can increase or decrease the number and it also accepts min_value and max_value. If I use a TextInput widget I won't get this functionality. If I use NumberInput widget it wont work with floats:

homework = forms.FloatField(
    required=False, max_value=10, min_value=0, 
    widget=NumberInput(
        attrs={'id': 'form_homework'}
    )
)

enter image description here

It doesn't include floats (i.e 5.5) when I click the + - buttons. Also, it doesn't show the float at all if I want to set the actual float (the homework's grade) as an initial value (using Jquery).

Any advice is welcome.

EDIT:

If I do:

class NumberInput(TextInput):
    input_type = 'number'

homework = forms.FloatField(
    required=False, max_value=10, min_value=0,
    widget=NumberInput(
        attrs={'id': 'form_homework', 'step': '0.1'}
    )
)

The 'step' attribute works but the max_value/min_value doesn't. If I do not define NumberInput that way and use the regular NumberInput, it doesn't work at all.

Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129
Alejandro Veintimilla
  • 10,743
  • 23
  • 91
  • 180
  • you will likely have to find a javascript that will implement this feature; there are a number that you can use that give options for what the up/down arrow will do (i.e. set the "step" size, i.e. 0.10 or 1.0, etc). – warath-coder Jan 14 '15 at 18:06
  • So.. yes I guess I can do with with Js, but I was wondering if there is a django widget or something. – Alejandro Veintimilla Jan 14 '15 at 18:30

4 Answers4

9

You can do this by including NumberInput with your form widget and setting step attribute

homework = forms.FloatField(
    required=False, max_value=10, min_value=0, 
    widget=forms.NumberInput(
        attrs={'id': 'form_homework', 'step': "0.01"}
    )
) 

Difference from above answer is missing forms reference with NumberInput of form

Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129
Projesh Bhoumik
  • 1,058
  • 14
  • 17
5

Just specify "step" attribute as a widget attribute, this way:

homework = forms.FloatField(
    required=False, max_value=10, min_value=0, 
    widget=NumberInput(
        attrs={'id': 'form_homework', 'step': "0.01"}
    )
)
Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129
matagus
  • 6,136
  • 2
  • 26
  • 39
2

You can also do this by including TextInput with your form widget

homework = forms.FloatField(
    required=False, 
    widget=forms.TextInput(
        attrs={'type': 'number', 'id':'form_homework', 'min': '0', 'max':'10', 'step':'0.01'}
    )
)
Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129
0

You can use forms.NumberInput as shown below, then all work properly:

from django import forms

homework = forms.FloatField(
    required=False, max_value=10, min_value=0,
    widget=forms.NumberInput(
        attrs={'id': 'form_homework', 'step': 0.1}
    )
)

In addition, this code below also works properly:

from django import forms

homework = forms.FloatField(
    required=False,
    widget=forms.NumberInput(
        attrs={'id': 'form_homework', 'max': 10, 'min': 0, 'step': 0.1}
    )
)
Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129