написание валидатора для полей хештега в модели django - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть модель, в которой есть несколько полей:

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 голосов
/ 15 апреля 2019

Если после последнего хэштега нет пробела, вы можете использовать совпадение с хэштегом, за которым следуют 1+ слов и затем повторять группу, которая соответствует пробелу и 1+ словам.

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

Объяснение

  • ^ Утверждение начала строки
  • #\w+ Совпадение #, затем 1+ слов символов
  • (?: #\w+)* Группа без захвата, повтор 0+ умножение на пробел, # и 1+ слов символов
  • $ Утверждение конца строки

Regex demo

Еслипосле шаблона может быть 1+ пробелов или табуляций, которые можно повторить класс символов [ \t]+:

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

Regex demo

0 голосов
/ 15 апреля 2019

Вы можете использовать это регулярное выражение для проверки ввода.В этом случае разделение не понадобится.

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

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

Надеюсь, это решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...