2013-09-26 35 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 '})) 

等等...

否則,你將不得不處理錯誤的看法。 它爲我嘗試這種簡單的方法... 這將允許用戶只輸入號碼

相關問題