2013-09-26 30 views
6

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

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

1)

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

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

这似乎并没有工作。我使用的是HTML 5,浏览器是Chrome。我究竟做错了什么 ?如何做得更好?

回答

0

最后我最终使用了一个基于jQuery的解决方案。 Question here。我添加了类“数字”,并添加了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(); 
      } 
     } 
    }); 
}); 
+0

clientside验证只是中途,你也应该验证serverside(你的表单的干净方法)。 – Jingo

+0

是的,我正在那样做。但我的客户有特殊要求,他希望能够输入数字。 –

10

的Django 1.6有NumberInput窗口小部件,但1.6是目前并不稳定。

但你可以尝试这样的事:

from django.forms import ModelForm, CharField, TextInput 

class PropertyForm(ModelForm): 

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

    class Meta: 
    ... 
1

这里是另一种解决方案:

  • 在模型文件
  • 添加CSS类字段添加验证模型形式
  • 使用jquery在文档/页面加载时将上述类的类型更改为'number'

IN THE MODEL:

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'); 
}); 
0

我知道这是一个faily旧线程,我加这为后代

要得到一个围绕此问题将以下内容保存为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功能对于其他类型的

警告:数字字段需要一个默认值以上工作

0

相反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 '})) 

等等...

否则,你将不得不处理错误的看法。 它为我尝试这种简单的方法... 这将允许用户只输入号码

相关问题