Ajax обновление страницы в реальном времени

Ну вообщем я делаю небольшой проект на джанго и я решил реализовать удобный поиск по какому либо параметру из моей формы. весь js мне писал chatgpt и я вообще в нем не разбираюсь совсем и в общем с "поиском" я работаю впервые. также то что сейчас меня беспокоит: оно по факту ищется но очень криво. все трясется и header дублируется под поиском. мне нужно динамическое обновление страницы при поиске по полям number, VIN, sent_at, status вот что имеем: html:

{% extends 'base.html' %}

{% block title %}
  Для крутых
{% endblock %}

{% block content %}
<div class="container">
    <div class="row mt-3">
        <input type="search" id="search-input" name="q" class="form-control form-control-dark text-bg-dark" placeholder="Поиск..." aria-label="Поиск">

        <div id="applications-list" class="mt-3">
            {% for application in applications %}
                <div class="application-item">
                    <p><strong>Имя:</strong> {{ application.name }}</p>
                    <p><strong>Номер телефона:</strong> {{ application.number }}</p>
                    <p><strong>VIN номер машины:</strong> {{ application.VIN }}</p>
                    <p><strong>Описание проблемы:</strong> {{ application.description }}</p>
                    <img src="{{ application.image.url }}">
                    <p><strong>Отправлено:</strong> {{ application.sent_at }}</p>
                    <p><strong>Статус:</strong> {{ application.status }}</p>
                    <br>
                </div>
            {% endfor %}
        </div>

        {% include 'includes/pagination.html' %}
    </div>
</div>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
    $(document).ready(function() {
        function searchAndUpdate() {
            let searchQuery = $('#search-input').val();
            $.ajax({
                url: window.location.href,
                data: { q: searchQuery },
                success: function(data) {
                    $('#applications-list').html(data);
                }
            });
        }

        setInterval(searchAndUpdate, 5000);\
    });
</script>
{% endblock %}

python:

class ProProfile(ListView):
    paginate_by = 6
    model = Applications
    template_name = 'pages/proprofile.html'

    def get_queryset(self):
        q = self.request.GET.get('q')
        if q:
            return Applications.objects.filter(
                Q(number__icontains=q) |
                Q(VIN__icontains=q) |
                Q(sent_at__icontains=q) |
                Q(status__icontains=q)
            )
        else:
            return Applications.objects.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        q = self.request.GET.get('q')
        applications_list = self.get_queryset()  # Используем get_queryset для фильтрации
        paginator = Paginator(applications_list, self.paginate_by)
        page = self.request.GET.get('page')

        try:
            applications = paginator.page(page)
        except PageNotAnInteger:
            applications = paginator.page(1)
        except EmptyPage:
            applications = paginator.page(paginator.num_pages)

        context['q'] = q
        context['applications'] = applications
        return context

вообщем то у меня получилось реализовать то что я хотел


{% block title %}
  Для крутых
{% endblock %}

{% block content %}
<div class="container">
    <div class="row mt-3">
        <input type="search" id="search-input" name="q" class="form-control form-control-dark text-bg-dark" placeholder="Поиск..." aria-label="Поиск">

        <div id="applications-list" class="mt-3" style="opacity: 0; transition: opacity 0.3s;">
            {% for application in applications %}
                <div class="application-item">
                    <p><strong>Имя:</strong> {{ application.name }}</p>
                    <p><strong>Номер телефона:</strong> {{ application.number }}</p>
                    <p><strong>VIN номер машины:</strong> {{ application.VIN }}</p>
                    <p><strong>Описание проблемы:</strong> {{ application.description }}</p>
                    <img src="{{ application.image.url }}" alt="Image" class="img-fluid">
                    <p><strong>Отправлено:</strong> {{ application.sent_at }}</p>
                    <p><strong>Статус:</strong> {{ application.status }}</p>
                    <br>
                </div>
            {% empty %}
                <p>Ничего не найдено.</p>
            {% endfor %}
        </div>

{% if applications.has_other_pages or applications %}
    <div id="pagination" style="opacity: 0; transition: opacity 0.3s;">
        {% include 'includes/pagination.html' %}
    </div>
{% endif %}

    </div>
</div>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
    function searchAndUpdate() {
        let searchQuery = $('#search-input').val();
        $.ajax({
            url: window.location.href,
            data: { q: searchQuery },
            success: function(data) {
                $('#applications-list').html($(data).find('#applications-list').html());
                $('#pagination').html($(data).find('#pagination').html());

                $('#applications-list').css('opacity', 1);
                $('#pagination').css('opacity', 1);
            }
        });
    }

    $(document).ready(function() {
        $('#search-input').on('input', function() {
            $('#applications-list').css('opacity', 0);
            $('#pagination').css('opacity', 0);
            searchAndUpdate();
        });

        setInterval(function() {
            $('#search-input').trigger('input');
        }, 5000);
    });
</script>
{% endblock %}
Вернуться на верх