在我的启发应用程序中(从民意测验教程开始,现在更大了),我正在实现自己的简单主题标签来回答文本。该实现非常少,实际上仅使用基于已标记单词的查询字符串的单词搜索过滤器。问题在于,URL中不接受许多在文本字段中有效的字符,因此,非专家用户制作的主题标签必须进行修改才能正常工作。人们想用连字号和&连字符打断他们,但这是行不通的。如果某些人正在#brain-storming,而其他人正在#brainstorming,也会很烦人。
创建一个伪验证器的风险是什么,该伪验证器从用户条目中删除查询字符串的破字符,但不产生验证错误?我目前正在独自工作,但确实将其视为其他人将来可以使用或开发的产品。
如果我为此任务创建一个验证器,是否更合适“验证”并作为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)
答案 0 :(得分:0)
很抱歉,在撰写我认为已经解决的问题并且我尝试过的第一件事效果很好时,所以没有必要回答。
我的解决方案是创建一个自定义表单CharField子类,该子类通过此附加步骤将'clean'子类化。
每种模型的每种形式的每个文本字段现在都是一个TextInputField,这是我本人的某些重复,可能是多余的。仍然有些担心,这是一种不好的做法,它会在用户点击“提交”后以某种方式静默修复用户的问题。
class TextInputField(forms.CharField):
def clean(self, value):
super(TextInputField, self).clean(value)
return validate_hashtag(value)