Ranger les données de ma db à partir d'un clique

Ranger les données de ma db à partir d'un clique - Javascript/Node.js - Programmation

Marsh Posté le 27-02-2024 à 06:53:42    

Bonjour,
 
Je bloque depuis plusieurs jours... Il y a vraisemblablement quelque chose que je ne comprends pas bien puisque l'exécution de mon code ne fonctionne pas : lorsque je clique sur une des options de mon sélect, je veux que la liste des livres de mon catalogue soit triée de A à Z ou du plus petit au plus grand, ou bien de Z à A ou du plus grand au plus petit (selon l'option sélectionnée).  
 
Ci-après, voici le contexte d'exécution :  
 
Je débute avec Django. J'ai créé une application nommée "books" qui se rattache à un projet "sgbj". Le template catalog.html de mon application est appelée par le template index.html de mon projet "sgbj". Donc l'url d'affichage de mon application "books" est la même que celle utilisée par mon projet "sgbj" :  
 

  • Mon ficher urls.py du projet "sgbj" :
Code :
  1. from django.contrib import admin
  2. from django.urls import path, include
  3. from books import views as books_views
  4. from . import views as project_views
  5. urlpatterns = [
  6.     path('admin/', admin.site.urls),
  7.     path('', books_views.catalog_view, name='index'),
  8.     path('contact/', project_views.contact_view, name='contact'),
  9.     path('publications/', include('articles.urls'), name='articles'),
  10. ]


 

  • Le fichier views.py du projet "sgbj" :  
Code :
  1. from django.shortcuts import render
  2. from books.views import catalog_view as books_catalog_view
  3. def index_view(request):
  4.     catalog_context = books_catalog_view(request)
  5.     books = catalog_context.get('catalog')
  6.     return render(request, 'index.html', {'catalog': books})


 

  • Le template index.html du projet "sgbj" :  
Code :
  1. {% extends 'template_base.html' %}
  2. {% block title %}Home_page{% endblock %}
  3. {% block content %}
  4.    
  5.     {% block catalog_content %}
  6.         <div id="catalog_content">
  7.             {% include 'catalog.html' %}
  8.         </div>
  9.     {% endblock %}
  10.     {% block sort_books %}
  11.     {% endblock %}
  12. {% endblock %}


 

  • Le template catalog.html de l'application "books":
Code :
  1. {% extends 'template_base.html' %}
  2. {% block title %}Catalog_page{% endblock %}
  3. {% block content %}
  4.     {% block sort_books %}
  5.         <div class="sort_books">
  6.             Tri par : 
  7.             <select id="sort_lastname" class="select_books sort_lastname" name="lastname">
  8.                 <option id="sort_lastname_author" class="sort_label" disabled selected hidden value="no_specific">auteur </option>
  9.                 <option id="sort_lastname_AZ" class="display_asc option_transparent" value="asc">A ... Z</option>
  10.                 <option id="sort_lastname_ZA" class="display_desc option_transparent" value="desc">Z ... A</option>
  11.             </select>
  12.             <select id="sort_title" class="select_books" name="titre">
  13.                 <option id="sort_title_title" class="sort_label" disabled selected hidden value="no_specific">titre </option>       
  14.                 <option id="sort_title_AZ" class="display_asc option_transparent" value="asc">A ... Z</option>
  15.                 <option id="sort_title_ZA" class="display_desc option_transparent" value="desc">Z ... A</option>
  16.             </select>
  17.             <select id="sort_date" class="select_books" name="date">
  18.                 <option id="sort_date_date" class="sort_label" disabled selected hidden value="no_specific">date </option>
  19.                 <option id="sort_date_-+" class="display_asc option_transparent" value="asc">- ... +</option>
  20.                 <option id="sort_date_+-" class="display_desc option_transparent" value="desc">+ ... -</option>
  21.             </select>
  22.         </div>
  23.     {% endblock %}
  24.     {% block catalog_title %}
  25.         <h1>Ma bibliothèque</h1>
  26.     {% endblock %}
  27.     {% for book in catalog %}
  28.         <p class="catalog">
  29.             <span class="lastname">{{ book.lastname }}</span>
  30.             <span class="firstname">{{ book.firstname }}</span>
  31.             <span class="title"><b>{{ book.title }}</b></span>
  32.             <span>ISBN : <span class="isbn">{{ book.isbn }}</span>
  33.         </p>
  34.     {% endfor %}
  35. {% endblock %}


 

  • La vue views.py de l'application "books" :
Code :
  1. from django.shortcuts import render
  2. from django.http import JsonResponse
  3. from django.db.models.functions import Lower
  4. from .models import Book
  5. def catalog_view(request):
  6.     books = Book.objects.all()
  7.     return render(request, 'books/catalog.html', {'catalog': books})
  8. def sort_books_view(request):
  9.     if request.is_ajax() and 'selected_option' in request.GET:
  10.         selected_column_option = request.GET.get('selected_option')
  11.         column_mapping = {
  12.             'sort_lastname_AZ': 'lastname',
  13.             'sort_lastname_ZA': '-lastname',
  14.             'sort_firstname_AZ': 'firstname',
  15.             'sort_firstname_ZA': '-firstname',
  16.             'sort_title_AZ': 'title',
  17.             'sort_title_ZA': '-title',
  18.             'sort_date_-+': Lower('date'),
  19.             'sort_date_+-': Lower('-date'),
  20.         }
  21.        
  22.         if selected_column_option in column_mapping:
  23.             sort_column = column_mapping[selected_column_option]
  24.             books = Book.objects.all().order_by(sort_column)
  25.             sorted_books = [{'lastname': book.lastname, 'firstname': book.firstname, 'title': book.title, 'isbn': book.isbn} for book in books]
  26.             return JsonResponse(sorted_books, safe=False)
  27.         else:
  28.             return JsonResponse({'error': 'Option de tri non valide.'})
  29.     else:
  30.         return JsonResponse({'error': 'Cette vue ne peut être appelée que via AJAX.'})


 

  • Mon script selector_books.js de l'application "books" (voir les lignes 54 à 91):
Code :
  1. document.addEventListener('DOMContentLoaded', function() {
  2.     var selectElements = document.querySelectorAll('#sort_lastname, #sort_firstname, #sort_title, #sort_date');
  3.     var defaultLabelOptions = {};
  4.     selectElements.forEach(function(selectElement) {
  5.         var defaultLabelOption = selectElement.querySelector('option');
  6.         defaultLabelOptions[selectElement.id] = defaultLabelOption.textContent;
  7.         defaultLabelOption.style.display = 'none';
  8.         selectElement.addEventListener('change', function() {
  9.             var selectedOption = this.options[this.selectedIndex];
  10.             var optionClass = selectedOption.getAttribute('class');
  11.             var optionText = selectedOption.textContent;
  12.             selectElements.forEach(function(otherSelect) {
  13.                 if (otherSelect !== selectElement) {
  14.                     var defaultOption = otherSelect.querySelector('option[value="no_specific"]');
  15.                     defaultOption.style.display = '';
  16.                     defaultOption.selected = true;
  17.                     otherSelect.querySelectorAll('option').forEach(function(option) {
  18.                         option.style.display = '';
  19.                     });
  20.                 }
  21.             });   
  22.             // Afficher toutes les options
  23.             var options = selectElement.querySelectorAll('option');
  24.             options.forEach(function(option) {
  25.                 option.style.display = '';   
  26.             });
  27.             // Cacher l'option sélectionnée
  28.             selectedOption.style.display = 'none';
  29.             if (optionClass === 'sort_label' || (optionText !== 'auteur A ... Z' && optionText !== 'auteur Z ... A' && optionText !== 'titre A ... Z' && optionText !== 'titre Z ... A' && optionText !== 'date - ... +' && optionText !== 'date + ... -')) {
  30.                 selectedOption.textContent = defaultLabelOptions[selectElement.id] + optionText;
  31.             }
  32.             // Masquer les options appropriées sans masquer l'élément sélectionné
  33.             if (optionClass === 'display_asc') {
  34.                 var descOptions = selectElement.parentNode.querySelectorAll('.display_desc');
  35.                 descOptions.forEach(function(option) {
  36.                     option.style.display = '';
  37.                 });
  38.             } else if (optionClass === 'display_desc') {
  39.                 var ascOptions = selectElement.parentNode.querySelectorAll('.display_asc');
  40.                 ascOptions.forEach(function(option) {
  41.                     option.style.display = '';
  42.                 });
  43.             }
  44.         });
  45.     });
  46.     $('#sort_lastname, #sort_firstname, #sort_title, #sort_date').on('change', function() {
  47.         var selectedOption = $(this).val();
  48.         if (selectedOption === "AZ" || selectedOption === "-+" || selectedOption === "ZA" || selectedOption === "+-" ) {
  49.             var dataToSend = {};
  50.             var selectedColumn = '';
  51.            
  52.             if ($(this).attr('id') === 'sort_lastname') {
  53.                 selectedColumn = 'lastname';
  54.                 dataToSend['selected_lastname_option'] = 'sort_' + selectedColumn + '_' + selectedOption.toUpperCase();
  55.                 dataToSend['selected_firstname_option'] = 'sort_firstname_' + selectedOption.toUpperCase();
  56.             } else if ($(this).attr('id') === 'sort_firstname') {
  57.                 selectedColumn = 'firstname';
  58.                 dataToSend['selected_firstname_option'] = 'sort_' + selectedColumn + '_' + selectedOption.toUpperCase();
  59.                 dataToSend['selected_lastname_option'] = 'sort_lastname_' + selectedOption.toUpperCase();
  60.             } else if ($(this).attr('id') === 'sort_title') {
  61.                 selectedColumn = 'title';
  62.             } else if ($(this).attr('id') === 'sort_date') {
  63.                 selectedColumn = 'date';
  64.             }
  65.            
  66.             $.ajax({
  67.                 url: '',
  68.                 data: dataToSend,
  69.                 dataType: 'json',
  70.                 success: function(data) {
  71.                     updateIndexData(data, selectedColumn);
  72.                 }
  73.             });
  74.         }
  75.     });
  76.     function updateIndexData(data, selectedColumn) {
  77.         $('#catalog_content .catalog p').each(function(index) {
  78.             $(this).find('.' + selectedColumn).text(data[index][selectedColumn]);
  79.             $(this).find('.isbn').text('ISBN : ' + data[index].isbn);
  80.         });
  81.     }
  82. });


 
 
L'affichage web en local fonctionnait bien avant que j'essaye de trier les données par ordre croissant/décroissant.
S'il vous plaît, j'espère que vous voudrez bien m'aider à identifier l'origine de la non exécution de mon code!


Message édité par relphe le 27-02-2024 à 10:14:31
Reply

Marsh Posté le 27-02-2024 à 06:53:42   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed