2013-09-26 2 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番号の検証を追加しました。しかし、これは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(); 
      } 
     } 
    }); 
}); 
+0

クライアント側の検証は途中であり、サーバー側(フォームのクリーンメソッド)も検証する必要があります。 – Jingo

+0

はい私はそれをやっています。しかし私のクライアントには、数字だけを入力できるようにしたいという特別な要件があります。 –

10

ジャンゴ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を使用して、ドキュメント/ページのロード時に上記のクラスのタイプを '番号'に変更します
0モデルにおける

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

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

モデルの形式で - これはfailyである私が知っているjqueryのクラスHTMLファイル内に

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

/JSファイル

$(document).ready(function(){ 
    $('.text_type_number').attr('type', 'number'); 
}); 
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機能を拡張することができます

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

など... ELSE

あなたがビューでエラーを処理する必要があります。 この簡単な方法を試してみてください... これでユーザーは番号のみを入力できます

関連する問題