Django Найдите хэштеги в строке и замените их, обернув в тег <a>
Заголовок длинноват и может запутать, поэтому позвольте мне объяснить.
Я создаю сайт социальной сети и хочу включить хэштеги. Например, если пользователь создаст пост, подобный этому:
Summer is gone. #sad #comeback #summer
Я хочу использовать python для замены всех вхождений # и слова следующим образом:
Summer is gone. <a href="http://127.0.0.1:8000/c/sad">#sad</a> <a href="http://127.0.0.1:8000/c/comeback">#comeback</a> <a href="http://127.0.0.1:8000/c/summer">#summer</a>
Вот что у меня есть на данный момент:
def clean_content(self):
content = self.cleaned_data.get('content')
content = profanity.censor(content) # (Unrelated Code)
arr = re.findall(r"@(\w+)", content)
replace_ar = []
for hsh in arr:
if len(hsh) < 80:
if Category.objects.filter(name__iexact=hsh):
# Old Category, Added This To Category List (Unrelated Code)
replace_ar.append(hsh)
else:
# New Category, Created Category, Then Added This To Category List (Unrelated Code)
replace_ar.append(hsh)
else:
# Don't do anything, hashtag length too long
# No Idea What To Do With replace_ar. Need help here.
В приведенном выше коде я беру текстовый ввод html и нахожу все #{{слова}}. Затем я просматриваю их и проверяю, существует ли категория с таким названием или нет. Если да, я просто добавляю ее в эту категорию, а если нет, я создаю категорию и затем добавляю ее. В обеих этих ситуациях я выталкиваю хэштег в массив replace_ar
.
Теперь я хочу заменить все хэштеги в массиве replace_ar
на url, как в примере "Лето прошло", приведенном выше. Как мне это сделать? Спасибо.
Чтобы заменить хэштеги (вида: "#categoryname") на url связанной категории:
def clean_content(self):
content = self.cleaned_data.get('content')
arr = re.findall(r"#(w+)", content)
for hsh in arr:
if len(hsh) < 80:
full_hash = '#' + hsh
if Category.objects.filter(name__iexact=hsh):
content = content.replace(full_hash, f'<a href="http://127.0.0.1:8000/c/{hsh}/">#{hsh}</a>')
else:
content = content.replace(full_hash, f'<a href="http://127.0.0.1:8000/c/{hsh}/">#{hsh}</a>')
Обратите внимание, что вы должны использовать reverse
вместо жесткого кодирования url.