Django 验证器纠正而不是拒绝用户输入

Django validator to correct rather than reject user input

在我的启发应用程序中(开始是民意调查教程,现在更大了)我正在为文本答案实现我自己的简单主题标签。实现非常简单,实际上只是使用基于已标记单词的查询字符串的单词搜索过滤器。问题是许多在文本字段中有效的字符在 URL 中是不可接受的,因此非专家用户创建的主题标签需要修改才能正常工作。人们想用连字号或 & 符号连接他们的话,但这是行不通的。如果有些人在#brain-storming 而其他人在#brainstorming,那也会很烦人。

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)