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.

2
  • 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). Commented Jan 14, 2015 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. Commented Jan 14, 2015 at 18:30

4 Answers 4

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

Sign up to request clarification or add additional context in comments.

Comments

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"}
    )
)

3 Comments

Thanks for your answer, It doesn't work though. Please look at the Edit.
I think @matagus was suggesting to use django.forms.NumberInput, not create your own input with that name.
For anyone wondering on @thespacecamel that means editing the code to look as follows - widget=forms.NumberInput(attrs=
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'}
    )
)

Comments

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}
    )
)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.