Как динамически фильтровать с помощью ListView
Я хочу динамически фильтровать результаты во внешнем интерфейсе, используя только класс ListView с поисковым входом.
Сначала он должен отображать весь список пользователей, но когда что-то вводится в поле поиска, он должен фильтровать результаты на основе этого ввода.
Какой самый лучший/короткий способ сделать это, используя только мой classBased View?
Мой текущий код:
Шаблон:
<div class="card mt-3">
<div class="card-body">
<form action="" form="get">
<input data-url="{% url 'klantbeheer' %}" class="zoekklanten" name="q" type="text" placeholder="Zoek op contactnaam...">
</form>
{% if object_list %}
<div class="single-table">
<div class="table-responsive">
<table class="table text-center">
<thead class="text-uppercase bg-dark">
<tr class="text-white">
<th scope="col">Bedrijfsnaam</th>
<th scope="col">Contactnaam</th>
<th scope="col">Locatie</th>
<th scope="col">Actie</th>
</tr>
</thead>
<tbody>
{% for user in object_list %}
<tr>
<td>{{ user.bedrijfsNaam }}</td>
<td>{{ user.contactNaam }}</td>
<td>{{ user.adres }}</td>
<td>
<a href="{% url 'klantupdaten' user.id %}"><i class="fas fa-edit"></i></a>
<a href="#" data-url="{% url 'klantverwijderen' user.id %}" class="deletegebruiker" data-bs-toggle="modal" data-bs-target="#dynamic-modal"><i class="fas fa-trash-alt"></i></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% else %}
<p>Geen gebruikers gevonden</p>
<p>
<a href="{% url 'klantaanmaken' user.id %}" class="btn btn-primary">Maak klant aan</a>
</p>
{% endif %}
</div>
</div>
Вид:
class ManageUserView(SuperUserRequired, ListView):
model = User
template_name = 'webapp/klant/beheerklant.html'
#Query based upon contactName
def get_queryset(self, query):
#Contactnaam bevat QUERY EN superuser is vals.
object_list = self.model.objects.filter(contactNaam__icontains=query).exclude(is_superuser=True)
return object_list
def post(self, request, *args, **kwargs):
query = self.request.POST.get('query', '')
print(query)
self.get_queryset(query)
JQuery:
$('.zoekklanten').on('keyup', function(){
var url = $(this).data('url')
var query = $(this).val();
$.ajax({
url:url,
type:'POST',
data:{
'query':query
},
dataType: 'json',
beforeSend: function(xhr, settings){
if(!csrfSafeMethod(settings.type) && !this.crossDomain){
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
success: function(result){
},
error: function(data){
}
})})
Это должно исправить это:
$(document).ready(function() {
$("#searchInput").keyup(function() {
var rows = $("#fbody").find("tr").hide();
if (this.value.length) {
var data = this.value.split(" ");
$.each(data, function(i, v) {
$("#fbody").find("tr td.contactNaam:contains(" + v + ")").parent().show();
});
} else rows.show();
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.css" rel="stylesheet" />
Search: <input type="text" id="searchInput" style="margin:20px">
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">contactNaam</th>
<th scope="col">Last</th>
<th scope="col">Handle</th>
</tr>
</thead>
<tbody id="fbody">
<tr>
<th scope="row">1</th>
<td class="contactNaam">Mark</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
<tr>
<th scope="row">2</th>
<td class="contactNaam">Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">3</th>
<td class="contactNaam">Larry</td>
<td>the Bird</td>
<td>@twitter</td>
</tr>
</tbody>
</table>