如何只在Django中创建一个表单字段数字

时间:2013-09-26 07:58:43

标签: django django-forms

在使用Django模型时,我有一个整数字段,它只是数字。 但在浏览器中它是一个文本字段,我可以在其中输入“字符”。我想让它只是“数字”。这该怎么做 ?即用户应该只能输入数字

我们可以通过设置字段的属性来实现。

1)

def __init__(self,*args,**kwargs):

        super(PropertyForm,self).__init__(*args, **kwargs)        
        self.fields['brokers_phone_number'].widget.attrs['type'] = "number"

这似乎不起作用。我使用的是html 5,浏览器是Chrome。我究竟做错了什么 ?怎么能做得更好?

5 个答案:

答案 0 :(得分:13)

Django 1.6有一个NumberInput Widget,但1.6目前还不稳定。

但你可以尝试这样的事情:

from django.forms import ModelForm, CharField, TextInput

class PropertyForm(ModelForm):

    brokers_phone_number = CharField( widget=TextInput(attrs={'type':'number'}))

    class Meta:
     ...

答案 1 :(得分:1)

最后我最终使用了基于jQuery的解决方案。 Question here。而不是添加类型我添加了一个类"数字"并在其上添加了jquery数字验证。但这是一个hackish解决方案,特别是当我们有html 5" number"到位。如果有人找到方法这样做,请回答。

表格形式:

 def __init__(self,*args,**kwargs):
    super( PropertyFloorForm, self).__init__(*args, **kwargs)
    self.fields['number_of_units'].widget.attrs['class'] = "number"

在模板中

$(document).ready(function() {
    $(".number").keydown(function(event) {
        // Allow: backspace, delete, tab, escape, and enter
        if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
            // Allow: Ctrl+A
            (event.keyCode == 65 && event.ctrlKey === true) ||
            // Allow: home, end, left, right
            (event.keyCode >= 35 && event.keyCode <= 39)) {
            // let it happen, don't do anything
            return;
        } else {
            // Ensure that it is a number and stop the keypress
            if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                event.preventDefault();
            }
        }
    });
});

答案 2 :(得分:1)

这是另一种解决方案:

  • 在模型文件中添加验证器
  • 将css类添加到模型表单中的字段
  • 使用jquery将上述类的类型更改为文档/页面加载上的“数字”

在模特中:

    exp_from = models.IntegerField(default=0,
        validators=[
            MaxValueValidator(100),
            MinValueValidator(0)
        ])

    exp_to = models.IntegerField(default=1,
        validators=[
            MaxValueValidator(100),
            MinValueValidator(1)
        ])

在模型表格中 - 添加一个jquery类

self.fields['exp_from'].widget.attrs['class'] = "text_type_number"
self.fields['exp_to'].widget.attrs['class'] = "text_type_number"

在HTML文件/ JS文件中

$(document).ready(function(){
   $('.text_type_number').attr('type', 'number');
});

答案 3 :(得分:0)

我知道这是一个很老的话题,我为后代添加了这个

要解决此问题,请将以下内容另存为html5type.py

from django import template
register = template.Library()
def html5type(var):
    if isinstance(var, int):
        return 'number'
    else:
        return 'text'  

register.filter('html5type', html5type)

然后,在模板中:

{% load html5type %}
<input type={{ field.value | html5type }} ></input>

当然,您可以进一步扩展html5type函数以用于其他类型

警告:数字字段需要默认值才能使上述工作

答案 4 :(得分:0)

而不是RegexValidator,只在表单属性中进行验证,如...

DataRow dr = (from r in ds.Tables[0].AsEnumerable()
         where (int)r["anotherField"] == 12
         orderby r["dateTimeField"] ascending
         select r).FirstOrDefault();

依旧......

否则你将不得不处理视图中的错误。 它对我有用,试试这个简单的方法...... 这将允许用户仅输入仅限数字