Django验证程序来纠正而不是拒绝用户输入

时间:2018-08-02 23:17:45

标签: django django-forms django-validation

在我的启发应用程序中(从民意测验教程开始,现在更大了),我正在实现自己的简单主题标签来回答文本。该实现非常少,实际上仅使用基于已标记单词的查询字符串的单词搜索过滤器。问题在于,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)

1 个答案:

答案 0 :(得分:0)

很抱歉,在撰写我认为已经解决的问题并且我尝试过的第一件事效果很好时,所以没有必要回答。

我的解决方案是创建一个自定义表单CharField子类,该子类通过此附加步骤将'clean'子类化。

每种模型的每种形式的每个文本字段现在都是一个TextInputField,这是我本人的某些重复,可能是多余的。仍然有些担心,这是一种不好的做法,它会在用户点击“提交”后以某种方式静默修复用户的问题。

class TextInputField(forms.CharField):

def clean(self, value):
    super(TextInputField, self).clean(value)
    return validate_hashtag(value)