Django 验证器纠正而不是拒绝用户输入
Django validator to correct rather than reject user input
在我的启发应用程序中(开始是民意调查教程,现在更大了)我正在为文本答案实现我自己的简单主题标签。实现非常简单,实际上只是使用基于已标记单词的查询字符串的单词搜索过滤器。问题是许多在文本字段中有效的字符在 URL 中是不可接受的,因此非专家用户创建的主题标签需要修改才能正常工作。人们想用连字号或 & 符号连接他们的话,但这是行不通的。如果有些人在#brain-storming 而其他人在#brainstorming,那也会很烦人。
创建从用户条目中去除查询字符串中断字符但不产生验证错误的伪验证器有哪些风险?我目前正在自己工作,但确实将此视为其他人将在未来工作或分叉的产品。
如果我为此任务创建一个验证器,'validate' 并作为 ModelForm 字段的一部分或在模型中修改更合适吗? (此应用程序中的一切都是 django 表单)。
这已经在核心 django 的某个地方了吗? (我不想加入 Django 主题标签应用程序来解决这个小问题,但我仍然需要学习很多 Django)
URL_BREAKER_TRANS = str.maketrans(dict((k, '') for k in [
'#', '!', '@', '$', '%', '^',
'&', '*', '(', ')', '+',
'=', ',', '.', '<', '>',
'?', '/', '|', '~', '[',
']', '{', '}', '-', '_',
'`']))
def validate_hashtag(string1):
"""this function takes a string input, checks for hashtags and
removes any url-breaking characters.
Although string.translate is very fast, splitting and then looping
word by word means this function will be demanding.
"""
string_list = string1.split(' ')
for i in range(len(string_list)):
if string_list[i].startswith("#"):
string_list[i] = "#" + string_list[i].translate(URL_BREAKER_TRANS)
else:
continue
return " ".join(string_list)
抱歉,我在写问题时考虑周全,并且我首先尝试的方法效果很好,所以不必回答。
我的解决方案是创建一个自定义表单 CharField 子类,该子类通过此附加步骤 'clean' 进行子类化。
每个模型的每个表单中的每个文本字段现在都是一个 TextInputField,这是我自己的一些重复,可能是多余的。仍然有点担心在用户点击提交后以某种方式默默地为用户修复问题的不良做法。
class TextInputField(forms.CharField):
def clean(self, value):
super(TextInputField, self).clean(value)
return validate_hashtag(value)
在我的启发应用程序中(开始是民意调查教程,现在更大了)我正在为文本答案实现我自己的简单主题标签。实现非常简单,实际上只是使用基于已标记单词的查询字符串的单词搜索过滤器。问题是许多在文本字段中有效的字符在 URL 中是不可接受的,因此非专家用户创建的主题标签需要修改才能正常工作。人们想用连字号或 & 符号连接他们的话,但这是行不通的。如果有些人在#brain-storming 而其他人在#brainstorming,那也会很烦人。
创建从用户条目中去除查询字符串中断字符但不产生验证错误的伪验证器有哪些风险?我目前正在自己工作,但确实将此视为其他人将在未来工作或分叉的产品。
如果我为此任务创建一个验证器,'validate' 并作为 ModelForm 字段的一部分或在模型中修改更合适吗? (此应用程序中的一切都是 django 表单)。
这已经在核心 django 的某个地方了吗? (我不想加入 Django 主题标签应用程序来解决这个小问题,但我仍然需要学习很多 Django)
URL_BREAKER_TRANS = str.maketrans(dict((k, '') for k in [ '#', '!', '@', '$', '%', '^', '&', '*', '(', ')', '+', '=', ',', '.', '<', '>', '?', '/', '|', '~', '[', ']', '{', '}', '-', '_', '`']))
def validate_hashtag(string1):
"""this function takes a string input, checks for hashtags and
removes any url-breaking characters.
Although string.translate is very fast, splitting and then looping
word by word means this function will be demanding.
"""
string_list = string1.split(' ')
for i in range(len(string_list)):
if string_list[i].startswith("#"):
string_list[i] = "#" + string_list[i].translate(URL_BREAKER_TRANS)
else:
continue
return " ".join(string_list)
抱歉,我在写问题时考虑周全,并且我首先尝试的方法效果很好,所以不必回答。
我的解决方案是创建一个自定义表单 CharField 子类,该子类通过此附加步骤 'clean' 进行子类化。
每个模型的每个表单中的每个文本字段现在都是一个 TextInputField,这是我自己的一些重复,可能是多余的。仍然有点担心在用户点击提交后以某种方式默默地为用户修复问题的不良做法。
class TextInputField(forms.CharField):
def clean(self, value):
super(TextInputField, self).clean(value)
return validate_hashtag(value)