在使用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。我究竟做错了什么 ?怎么能做得更好?
答案 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)
这是另一种解决方案:
在模特中:
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();
依旧......
否则你将不得不处理视图中的错误。 它对我有用,试试这个简单的方法...... 这将允许用户仅输入仅限数字