【问题标题】:Django validator to correct rather than reject user inputDjango验证器纠正而不是拒绝用户输入
【发布时间】:2018-08-02 23:17:45
【问题描述】:

在我的启发应用程序(从投票教程开始,现在更大)中,我正在为文本答案实现自己的简单主题标签。该实现非常简单,实际上只是使用基于已标记单词的查询字符串的单词搜索过滤器。问题是文本字段中的许多有效字符在 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)

【问题讨论】:

    标签: django django-forms django-validation


    【解决方案1】:

    抱歉,在写下这个问题时,我已经深思熟虑了,我尝试的第一件事效果很好,所以不必回答。

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

    每个模型的每个表单中的每个文本字段现在都是一个 TextInputField,这是我自己的一些重复,可能是多余的。仍然有点担心,在用户点击提交后以某种方式默默地为用户修复问题是不好的做法。

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

    【讨论】:

    • 不是 django,但您可以添加一些 javascript 与用户交流,例如不接受 x 字符,并发出消息。
    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多