我正在用两种语言(英语和希伯来语)创建一个网站(Speedy Net)。我有一个输入字段(“ slug / username”),该字段必须为英语(字母数字拉丁字符)。当我通过手机进入网站时,我可以用希伯来语写文字。是否可以在此输入字段中强制使用英文键盘?我注意到,对于电子邮件地址(电子邮件输入),键盘已经是英文了。
更新:在服务器端,我们确实验证了输入。我不想在客户端(使用JavaScript)上验证输入,也不想阻止用户键入希伯来字符(稍后可能会这样做),但是我想使(强制)默认键盘语言为英语。我注意到,对于电子邮件和密码,当将其方向设置为ltr
时,键盘的默认语言是英语。但是在“子弹/用户名”字段上没有。
我测试的浏览器会自动验证电子邮件输入为英文。您不能在那里使用希伯来语字符。
我进行了搜索,但没有在Stack Overflow或其他地方找到类似的问题。
从属字段可以包含服务器将其转换为破折号的任何非字母数字字符。例如,服务器将Aa=Bb!1@2#3$4%56
转换为aa-bb-1-2-3-4-56
,这是Speedy Net上用户的有效子弹。但是,אא-בב-1-2-3-4-56
在Speedy Net上不是有效的标记。用户不得以至少4个拉丁字母开头。
页面在希伯来语时会出现问题。如果页面是英语,则没有问题。
在我的网站中,输入名字和姓氏时,用户可以输入任何语言。输入电子邮件地址(电子邮件输入)时,键盘会自动切换为英语(在Galaxy上经过测试)。但是,在输入信息/用户名(在电子邮件地址之后)时,如果在输入电子邮件之前(在Galaxy上)希伯来语位于希伯来语,键盘将切换回希伯来语。这就是我要防止的事情。
答案 0 :(得分:13)
我认为您有2种选择。
第一个方法是让用户输入所需的任何内容,但在后端使用验证器,该验证器仅接受带有拉丁字符的用户名。
class UsernameValidator(validators.RegexValidator):
regex = r'^[\w.@+-]+\Z'
message = _(
'Enter a valid username. This value may contain only letters, '
'numbers, and @/./+/-/_ characters.'
)
flags = 0
class YourUser(User):
username = models.CharField(
_('username'),
max_length=150,
unique=True,
help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
validators=[UsernameValidator()],
error_messages={
'unique': _("A user with that username already exists."),
},
)
第二种方法是使用某种JavaScript掩码库,例如https://imask.js.org/,这样可以防止用户插入您不希望他们插入的任何数据,但是无论如何,您都应该在后端,如果您采用这种方法
答案 1 :(得分:9)
您不能强制使用语言本身(文本输入只知道字符,对语言一无所知,实际上用户名是相当任意的字符序列,不一定是现有语言中的现有单词),但是您可以限制允许使用的字符为ascii(这实际上是您的实际需求)。
在后端(django),您可以将现有代码用于子弹(参见models.SlugField和validators.validate_slug),也可以编写自己的验证器来满足更具体的需求。
在前端,您可以使用plain old-school solution like this one或use the pattern attribute of the input。
NB:请注意,由于特定于Django的后端,我没有投票同意以重复的方式结束您的问题,但是您确实应该在发布问题之前进行搜索,因为这里和其他地方已经有很多类似的问题...
答案 2 :(得分:0)
暴力破解和错误答案...排序,这会产生副作用(例如限制您可以在页面上使用的字符范围-无需表情符号☹),但是您可以使用charset
元标记并将其设置为US-ASCII之类的内容。
<meta charset="US-ASCII">
您也许可以将输入字段/表单放入具有有限字符集的iframe中。
再次,是一个答案。
答案 3 :(得分:0)
在验证方面,[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
元素中的"pattern" attribute是widely supported,并提供纯CSS验证。
就显示正确的屏幕键盘而言,我认为[目前]最好将type =“ email”与以上结合使用*-在all supported types中,这是唯一的选择自动切换到拉丁语,同时允许按字母顺序输入-虽然浏览器最好在模式允许的范围内提示并且不显示区域键盘,但是specification在这方面确实需要任何特殊的努力。
[9, 7, 8, 9, 7]
[3, 1, 2, 3, 1]
[6, 4, 5, 6, 4]
[9, 7, 8, 9, 7]
[3, 1, 2, 3, 1]
<input>
*,也就是说,缺少一些根本性的解决方案,例如从DOM和JS构造自定义OSK并通过立即给予非输入元素焦点来挂起系统OSK。