10

在使用 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。我究竟做错了什么 ?怎样才能做得更好?

4

5 回答 5

19

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:
     ...
于 2013-09-26T09:33:35.257 回答
3

最后,我最终使用了基于 jQuery 的解决方案。 问题在这里。我没有添加类型,而是添加了一个类“数字”并在其上添加了 jquery 数字验证。但这是一个骇人听闻的解决方案,尤其是当我们有 html 5“数字”时。如果有人找到这样做的方法,请回答。

在表格中:

 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();
            }
        }
    });
});
于 2013-09-26T09:19:12.830 回答
2

这是另一个解决方案:

  • 在模型文件中添加验证器
  • 向模型表单中的字段添加 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');
});
于 2013-10-29T06:13:46.467 回答
1

我知道这是一个失败的旧线程,我为后代添加这个

要解决此问题,请将以下内容另存为 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 函数

警告:数字字段需要一个默认值才能正常工作

于 2016-04-19T09:14:53.970 回答
1

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

class StaffDetailsForm(forms.ModelForm):
    number = forms.CharField(required=True,widget=forms.TextInput(attrs={'class':'form-control' , 'autocomplete': 'off','pattern':'[0-9]+', 'title':'Enter numbers Only '}))

等等...

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

于 2017-05-26T12:18:37.140 回答