Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1454 connectés 

  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2464870
relphe
Posté le 27-02-2024 à 06:53:42  profilanswer
 

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
mood
Publicité
Posté le 27-02-2024 à 06:53:42  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

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

 

Sujets relatifs
PHP/AJAX JQuery => Comment récupérer les données en PHP ?Synchronisation 2 bases de données PostgreSQL
Pourquoi lorsque je clique sur le bouton Start il desactive les Labels[Postgresql]Trigger à partir d'une liste
[Powershell]Manipuler des données dans une clé de registreHive accorde l'autorisation d'étendue de la base de données
Extraction de données d'un PDFScript bash/python extraire données bdd
[Powershell] [RESOLU] Lire caractères à partir du 17eme d'une chaineQuestion analyse/visualisation de données, niveau noob
Plus de sujets relatifs à : Ranger les données de ma db à partir d'un clique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR