#python #html #jquery #django #django-models
#python #HTML #jquery #django #django-модели
Вопрос:
У меня большая модель django с примерно 800 объектами, и я хочу создать представление, в котором пользователь может выбрать определенное количество этих объектов для передачи в другое представление для дальнейшей обработки. Тот факт, что в модели так много объектов, делает перечисление всех объектов очень непрактичным, поскольку пользователю придется прокручивать 800 объектов.
Чтобы решить эту проблему, я хочу разместить панель поиска по мере ввода в верхней части представления, чтобы пользователь мог ввести имя объектов и выбрать их, щелкнув по ним. Когда объекты выбраны, они должны отображаться под панелью поиска в виде тегов, которые пользователь может удалить, нажав «x» рядом с каждым из них.
Когда пользователь сделал все необходимые выборки, он должен иметь возможность нажать кнопку и перейти к следующему представлению, где доступны эти выбранные объекты.
Модель, которую я использую, может быть упрощена до:
class Song():
song_name = models.CharField(max_length=256)
song_author = models.CharField(max_length=256, blank=True)
song_content = models.TextField()
def __str__(self):
return self.song_name
class Meta:
ordering = ['song_order']
song_order = models.PositiveIntegerField(editable=False, db_index=True)
До сих пор мне удавалось создавать представление для поиска по модели.
mytemplate.html
<!DOCTYPE html>
{% load static %}
<html style="height: 100%;" lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="preload" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material Icons" as="style" onload="this.rel='stylesheet'">
<link rel="preload" href="https://unpkg.com/bootstrap-material-design@4.1.1/dist/css/bootstrap-material-design.min.css" as="style" onload="this.rel='stylesheet'">
<link rel="stylesheet" href="{% static 'css/main.css' %}">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
</head>
<body>
{% block body_block %}
<div class="container" style="padding-bottom:40px;margin-top: 35px;">
<div class="form-group">
<label for="searchInput" class="bmd-label-floating">Search</label>
<input type="text" class="form-control" id="searchInput" oninput="filter()">
</div>
<ul class="list-group bmd-list-group-sm">
{% for song in songs %}
<div
class="list-group-item"
data-title="{{song.song_name}}"
data-author="{{song.song_author}}"
data-lyrics="{{song.song_content}}">
<h4>
{{song.song_name}}
{% if song.song_author %}
({{ song.song_author }})
{% endif %}
</h4>
</div>
{% endfor %}
</ul>
</div>
<script>
$('#searchInput').focus();
function short(s) {
let punctuationRegEx = /[.,/#!$%^amp;*;:{}=-_`~()]/g;
return s.replace(punctuationRegEx, '')
.toLowerCase()
.normalize("NFD")
.replace(/[u0300-u036f]/g, "");
}
function filter() {
let f = short($('#searchInput').val());
$('.list-group-item').each(function (index) {
if (short($(this).data('title') "").includes(f) ||
short($(this).data('author') "").includes(f)
) {
$(this).show();
} else {
$(this).hide();
}
});
}
</script>
{% endblock %}
</body>
</html>
views.py
class SongListView(ListView):
context_object_name = 'songs'
model = Song
template_name = "songapp/mytemplate.html"
Есть идеи о том, как сделать выбор?
Ответ №1:
Я создал программу инвентаризации деталей с поиском по мере ввода.
Это полный пример вызова ajax для поиска и базы данных.
Вы можете изменить его, чтобы показать результаты при поиске с помощью X.
Комментарии:
1. Спасибо, но эта часть — это именно то, что я уже реализовал. Часть, которая меня больше интересует, касается выбора результатов и отображения их в виде тегов в строке поиска. Если у вас есть какие-либо предложения, пожалуйста, дайте мне знать!