Вернуть имена пользователей, упомянутые в сообщении, в виде ссылок на профили этих пользователей внутри сообщения. - PullRequest
1 голос
/ 29 января 2020

Привет, ребята. Я пытаюсь получить свой код для проверки пользователя, упомянутого в посте с @username, который находится в базе данных, и вернуть ссылку на этот профиль пользователя как @username. В настоящее время я могу получить пользователей в бэкэнд с переменной tagged_users в моих представлениях. В нем хранятся упомянутые пользователи, но как мне получить к нему доступ в шаблоне, чтобы он давал мне ссылку на эти профили пользователей? пока мой код в шаблоне

{% if post.post|slice:":1" == '@' %}
   <a href="{% url 'profile_with_pk' pk=user.username %}">
     {{ post.post }}
   </a>
   {% else %}
   {{ post.post }}
   {% endif %}

, он возвращает весь пост в виде ссылки, но не возвращает фактического пользователя, упомянутого в сообщении, вместо этого он делает ссылку на текущего пользователя, вошедшего в систему * 1004. *

Это мой код, который возвращает пользователей, упомянутых в списке tagged_users, правильно. Я хочу получить доступ к этому в шаблоне как к ссылке на эти профили пользователей в сообщении.

def post(self, request, pk=None):
        if pk:
            user = User.objects.get(pk=pk)
        else:
            user = request.user
        form = HomeForm(request.POST)
        users = User.objects.all()
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()
            tagUsers = re.findall(r"@+(\w+)", post.post)
            tagged_users = list()
            for username in tagUsers: 
                    user = User.objects.get(username=username) 
                    tagged_users.append(user)
                    print(tagged_users)
            text = form.cleaned_data['post']
            form = HomeForm()
            tag = tagged_users
            return redirect('home')


        context = {'form': form, 'text': text, 'users':users, 'user': user, 'tag':tag, 'tagUsers':tagUsers  }
        return render(request, self.template_name, context)

1 Ответ

1 голос
/ 29 января 2020

Есть несколько проблем. Начнем с этого:

 <a href="{% url 'profile_with_pk' pk=user.username %}">
     {{ post.post }}
 </a>

Весь пост обернут в ссылку. Я думаю, вы хотите сделать ссылку на автора сообщения, верно? Затем (нужно только угадать схему вашей модели, которую вы не опубликовали), вам нужно что-то вроде этого:

# iteration through posts somewhere here
<a href="{% url 'profile_with_pk' pk=user.username %}">user.username</a>
{{ post.post }}

Далее, если вы пометили пользователей, вам нужно как-то поместить их в шаблон в ваших постах. В зависимости от того, как вы sh добавите ссылку на упомянутых пользователей, это может быть что-то вроде:

 # iteration through posts somewhere here
<a href="{% url 'profile_with_pk' pk=user.username %}">user.username</a>
{{ post.post }}
Mentions: {% for tagged_user in tagUsers %} {{ tagged_user.username }} {% endfor %}

Или, может быть, вы хотите вставить ссылки прямо в текст сообщения? Затем вам нужно создать структуру поста перед передачей его в шаблон (пример снят; скорее, потребуются улучшения):

from django.utils.html import mark_safe

def post(self, request, pk=None):
    ...
    post_text = post.post
    tagUsers = re.findall(r"@+(\w+)", post.post)
    tagged_users = list()
    for username in tagUsers: 
        user = User.objects.get(username=username) 
        for match in re.finditer(username, post_text):
            start = match.start()
            end = match.end()
            profile_link = reverse('profile_with_pk', kwargs={'pk': user.id})
            post_text[start:end] = mark_safe(f'<a href="{profile_link}">username</a>')
    ...
    # return post_text to template context and use in the same way as used post
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...