Я создал шаблон, в котором у вас есть HTML-таблица и iframe, отображающий PDF-файлы, ранее загруженные пользователем:
Цель состоит в том, чтобы пользователь мог сопоставить записи таблицы с PDF-файлом или несколькими PDF-файлами. Эта часть сделана.
Но теперь я хотел бы знать, как лучше всего фильтровать данные моей таблицы. Я создал таблицу следующим образом:
{% extends "website/base.html" %}
{% block content %}
{% load static %}
{% load evidence_extras %}
<script src = "{% static 'evidence/matching_final.js' %}"></script>
<link rel = "stylesheet" type = "text/css" href = "{% static 'evidence/css/style.css' %}">
<script src='https://cdnjs.cloudflare.com/ajax/libs/axios/1.6.8/axios.js'></script>
<div class = "container">
{% csrf_token %}
<div class = "row">
<div class = "col-8">
<div class = "row">
<div class = "col-12">
<table class = "table">
<thead class = "table-dark">
<td>
id
</td>
.......
</thead>
<tbody>
{% for piece in transactions %}
<tr onclick = "handleRowClick(this, {{piece.id}})">
<td>
{{ piece.id }}
</td>
......
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class = "row">
<div class = "col-12">
<button onclick = "handleMatch(this)" class = "btn btn-primary" style = "width: 100%;">Match</button>
</div>
</div>
</div>
<div class = "col-4 overflow-scroll" style = "height: 60em;">
{% for evidence in evidences %}
<div class = "row">
<div class = "col-12">
<div class = "card" id = "evidence_{{evidence.id}}">
<div class = "card-header">{{ evidence.name}}</div>
<div class = "card-body">
<iframe src = "/evidence/pdf/{{evidence.id}}" id = "pdf_frame" width = "100%"
height = "400"></iframe>
<ul>
<li maxlength = "20"> file: {{evidence.file}} </li>
<li maxlength = "20"> hash: {{evidence.hash}} </li>
</ul>
<div class = "row">
<div class = "col-6">
<button onclick = "handleMarkClick(this, {{evidence.id}})" class = "btn btn-primary"
style = "width: 100%;">mark</button>
</div>
<div class = "col-6">
<button onclick = "handleExpandClick(this,{{evidence.id}})" class = "btn btn-primary"
style = "width: 100%;">show</button>
</div>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endblock %}
Если бы я полностью построил таблицу с помощью JavaScript, фильтрация не была бы проблемой, но я не думаю, что это будет правильный подход для Django?
Можно ли применить фильтр непосредственно к контекстным данным во внешнем интерфейсе, возможно, с помощью JavaScript?
Я не хочу перезагружать данные каждый раз, когда кто-то что-то вводит в поле фильтра, поскольку я уже загрузил необходимые данные и хочу избежать ненужных запросов к базе данных.
Может ли кто-нибудь указать мне правильное направление?
Спасибо!
Редактировать:
Я забыл упомянуть, что предпочитаю не использовать готовые библиотеки Django, поскольку я все еще учусь и мне нужно немного настроить.
Редактировать2: Минимальный воспроизводимый пример -> стек.html:
{% extends "website/base.html" %}
{% block content %}
{% load static %}
<link rel = "stylesheet" type = "text/css" href = "{% static 'evidence/css/style.css' %}">
<div class = "container">
{% csrf_token %}
<div class = "row">
<div class = "col-8">
<div class = "row">
<div class = "col-12">
<table class = "table">
<thead class = "table-dark">
<tr>
<td>
mame
</td>
<td>
hash
</td>
<td>
something
</td>
</tr>
</thead>
<tbody>
{% for row in stack %}
<tr>
<td>
{{ row.name }}
</td>
<td>
{{ row.hash }}
</td>
<td>
{{ row.something }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
вид:
def stack(request):
context = Stack.objects.all()
return render(request, "evidence/stack.html", {"stack": context})
URL-адреса:
app_name = "evidence"
urlpatterns = [
...,
path('stact', stack, name='stack'),
]
Модель:
class Stack(models.Model):
name = models.CharField(max_length=150)
hash = models.CharField(max_length=150)
something = models.CharField(max_length=150)
@ChukwujiobiCanon это не что иное, как таблица HTML. Но я могу добавить жестко запрограммированную таблицу, если это поможет.
@ChukwujiobiCanon добавил простую таблицу
Вы можете выполнять фильтрацию только через JS, но если вы включите нумерацию страниц, вам придется выполнять фильтрацию на протяжении всего запроса к серверной базе данных. и правильный способ — обеспечить правильную фильтрацию и нумерацию страниц через бэкэнд. вы можете просто добавить кнопку для фильтрации информации, а не мгновенной фильтрации при вводе текста.
Привет, одновременно никогда не будет более 30-50 записей в таблицах и нескольких PDF-файлов, поэтому нумерации страниц не будет. Является ли в этом случае плохим подходом игнорировать механизм шаблонов Django и строить таблицу напрямую через js? Мой подход заключался бы в том, чтобы установить данные контекста в тег скрипта, получить данные оттуда и построить исходную таблицу/фильтрацию таким образом. Я думаю, кнопка фильтра тоже подойдет. Я новичок в Django, поэтому не слишком много знаю о лучших подходах.
Лучший подход — тот, который я обсуждал выше, но вы можете избежать его и использовать JS только в том случае, если имеется только 30-50 записей. У меня было приложение, в котором клиент изначально думал, что записей будет мало, поэтому нет необходимости добавлять нумерацию страниц. И одно это решение не включать нумерацию страниц разрушило все его приложение, когда количество клиентов увеличилось, что сделало его очень медленным. и в конце это нужно было переделывать (нумерацию страниц с фильтрацией всего этого). так что выбирайте с умом.
О, ладно, это хороший момент. Думаю, я воспользуюсь вашим подходом, просто на всякий случай. Большое спасибо
@user3793935 user3793935 вообще нет проблем
Поделитесь минимальным воспроизводимым примером вашей текущей настройки.