"Видеоурок"

Код на Гитхабе

В этом уроке мы собираемся заставить панель поиска пользователя, которая была в нашей панели навигации, работать. Мы будем использовать объект Q, который поставляется с Django, чтобы заставить это работать. Сначала нам нужно будет внести некоторые изменения в нашу панель навигации.

Обновление панели навигации

Нам нужно добавить метод и действие в форму, этот URL-адрес действия еще не создан, но мы назовем шаблон URL-адреса так же, как это, когда мы создадим его позже. Нам также нужно добавить кнопку отправки, для этого мы будем использовать значок шрифта awesome. Нам также нужно добавить имя и значение в поле ввода. Мы будем использовать имя для получения значения позже в нашем представлении, значение сохранит все, что мы ввели, заполненным в поле ввода.

лендинг/шаблоны/лендинг/navbar.html:

<form class="d-flex" method="GET" action="{% url 'profile-search' %}">
            <div class="input-group">
                <span class="input-group-text" id="basic-addon1">@</span>
                <input type="text" class="form-control" placeholder="Username" aria-label="Username" aria-describedby="basic-addon1" name='query' value="{{ request.GET.query }}">
                <button style="border: none; background-color: transparent; box-shadow: none" type="submit"><i class="fas fa-search"></i></button>
            </div>
</form>

Добавление представления поиска и URL-адреса

Теперь, когда у нас настроен шаблон для перехода к URL-адресу поиска, давайте создадим представление, а затем добавим путь к URL-адресу. Первое, что нам нужно сделать, это использовать общий класс View и добавить метод get, так как это тип запроса, который отправляет наша форма. Далее нам нужно получить значение из атрибута имени в нашей форме, мы можем сделать это с помощью self.request.GET.get(‘query’). После этого мы можем использовать объект Q для фильтрации по имени пользователя в профилях. Наконец, мы отобразим шаблон с profile_list в контексте.

социальные/представления.py:

class UserSearch(View):
    def get(self, request, *args, **kwargs):
        query = self.request.GET.get('query')
        profile_list = UserProfile.objects.filter(
            Q(user__username__icontains=query)
        )
        context = {
            'profile_list': profile_list
        }
        return render(request, 'social/search.html', context)

социальные/urls.py:

path('search/', UserSearch.as_view(), name='profile-search'),

Добавление шаблона поиска

Последним шагом для того, чтобы все заработало, является создание шаблона search.html. Это будет довольно просто, мы просто пройдемся по профилям, с которыми он совпал, и перечислим имя пользователя, местоположение и количество подписчиков, которые у них есть.

социальные/шаблоны/социальные/search.html:

{% extends 'landing/base.html' %}
{% block content %}
<div class="container">
    {% for profile in profile_list %}
    <div class="row justify-content-center mt-3">
        <div class="col-md-5 col-sm-12 border-bottom position-relative">
            <div class="position-relative">
                <p><a style="text-decoration: none;" class="text-primary" href="{% url 'profile' profile.pk %}">@{{ profile.user }}</a></p>
                {% if profile.location %}
                <p>{{ profile.location }}</p>
                {% endif %}
                <p>Followers: {{ profile.followers.all.count }}</p>
            </div>
        </div>
    </div>
    {% endfor %}
</div>
{% endblock content %}