为Django模型中的标签字段编写验证器

时间:2019-04-15 11:52:06

标签: python regex django validation

我有一个模型,其中包含一些字段:

class Book(models.Model):
    title = models.CharField(max_length=160, help_text='H1(SEO)',blank=True)
    hashtags = models.TextField(blank=True, validators=[validate_hashtags])

#标签输入应类似于:

#sth #sth #sth

事实上,除了最后一个标签之外,每个标签后面都需要有一个空格(最后一个标签后面不需要任何空格)。这是我使用正则表达式的验证器功能

def validate_hashtags(value):
    string1 = value.split()
    string2 = re.findall("(#\\w+ )", value)
    if re.match("^#\\w+$", string1[-1]):
        matching_counter = len(string2) + 1
    else:
        matching_counter = len(string2)
    if len(string1) != matching_counter:
        raise ValidationError("please enter # in the correct format")

但是它不能正常工作,有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式来验证输入。在这种情况下,不需要拆分。

^(#\w+\s+)+$

#sth #sth #sth - Valid
#sth sth #sth - Invalid
#sth#sth #sth  - Invalid

希望它可以解决问题。

答案 1 :(得分:0)

如果最后一个#标签后面没有空格,则可以使用match#标签,后跟1 +个单词字符,然后重复一个匹配一个空格和1 +个单词字符的组。

^#\w+(?: #\w+)*$

说明

  • ^断言字符串的开头
  • #\w+匹配#,然后是1个以上的字符字符
  • (?: #\w+)*非捕获组,重复0+次空格,#和1+个单词字符
  • $声明字符串结尾

Regex demo

如果该模式之后可以有1个以上的空格或制表符,则可以重复character class [ \t]+

^#\w+(?:[ \t]+#\w+)*$

Regex demo