Partage
  • Partager sur Facebook
  • Partager sur Twitter

Django: Rrecherche avancée (multicritère)

Il me renvoie une table vide

    2 août 2015 à 21:41:38

    Bonjour, 

     Je suie le cours sur la programmation Web en Python (Django). J'ai créer une petite application qui permet  grace a une page web entering_data.html de stocker dans une base de données des produits alimentaires. Grace a une deuxième page consulting_data.html, je peux consulter les produits enregistre et en particulier ceux qui correspondent a certains critères saisi via un formulaire dans consulting_data.html.

      Problème: En fait la page renvoie par défaut tout les produits sans problème mais quand je veux récupérer un produit en particulier, il me renvoie un tableau vide!!

     Ci-joint, mes deux fichiers: views.py (je n'ai mis que la fonction qui permet l'affichage des données), et la page web consulting_data.html:

    views.py:

    def data_consulting(request):
        # TODO: Search Form does not work, you may fix it when your will read the second chapter in third part of the book.
        if request.method == 'POST':
            form = FilterForm(request.POST)
            if form.is_valid():
                conditions = [('toBuy', form.cleaned_data['toBuy']), ('name__contains', form.cleaned_data['searchName']),
                             (('price__gte', form.cleaned_data['searchPriceBegin']), ('price__lte', form.cleaned_data['searchPriceEnd'])),
                             (('calories__gte', form.cleaned_data['searchCalorieBegin']),
                              ('calories__lte', form.cleaned_data['searchCalorieEnd'])),
                             (('date__gte', form.cleaned_data['DateBegin']), ('date__lte', form.cleaned_data['DateEnd']))]
    
                all_products = Product.objects.filter(reduce(operator.or_, [Q(condition) for condition in conditions]))
                send = True
                all_products = Product.objects.filter(reduce(operator.or_, [Q(condition) for condition in conditions]))
        else:
            form = FilterForm()
            all_products = Product.objects.all()
    
        sum_price = sum_product_by('price')
        sum_calories = int(sum_product_by('calories'))
        return render(request, 'mealManager/data_consulting.html', locals())
    
    
    # Function can sum all attribute by field given as parameter:
    # Remark: The Field must be Integer or Float
    def sum_product_by(field):
        result = 0.0
        for product in Product.objects.all():
            result += product.__getattribute__(field)
        return result

    data_consulting.html

    {% extends "base.html" %}
    
    {% block title %}
    	Consulter les Produits
    {% endblock %}
    
    <!-- TODO me: Maybe i may put a Scroll bar when the table will be bigger-->
    {% block content %}
        <!-- Ameliorations:
                Personnaliser l'affichage:
                    - chercher un produit en particulier par nom.
                    - calculer lle montant totale des produit achete dans une date precise ou dans une perdiode precise.
        -->
    
    <div class="search">
        <form method="post" action="{% url "mealManager.views.data_consulting" %}">{% csrf_token %}
            <div class ="block1">
                <fieldset class="searchField1">
                        <legend>Par nom:</legend>
                        <p> <label for="id_searcheName">Nom</label> : {{ form.searchName }} </p>
                </fieldset>
    
                <fieldset class="searchField5">
    				    <legend>Par Date:</legend>
    				    <p>
    					    <label for="id_DateBegin" class="text_label"> Le: </label><br /> {{ form.DateBegin }}
                            <label for="id_DateEnd"  class="text_label1" > Le: </label><br /> {{ form.DateEnd }}
       				    </p>
                </fieldset>
    
                <fieldset class="searchField2">
    				    <legend>En Stock:</legend>
    				    <p>
    					    {{ form.toBuy }} <label for="id_toBuy">En Stock ?</label><br />
       				    </p>
                </fieldset>
            </div>
    
            <div class="block2">
                <fieldset class="searchField3">
    				    <legend>Par Nombres de Calories:</legend>
    				    <p>
                             <label for="id_searchCalorieBegin" class="text_label3">Min:</label><br /> {{ form.searchCalorieBegin }}
                             <label for="id_searchCalorieEnd" class="text_label4">Max:</label><br /> {{ form.searchCalorieEnd }}
       				    </p>
                </fieldset>
    
                <fieldset class="searchField4">
    				    <legend>Par Prix:</legend>
    				    <p>
                             <label for="id_searchPriceBegin" class="text_label3">Min:</label><br /> {{ form.searchPriceBegin }}
                             <label for="id_searchPriceEnd" class="text_label4">Max:</label><br /> {{ form.searchPriceEnd }}
       				    </p>
                </fieldset>
    
                <p class="search_send"><input type="submit", value="Afficher Resultats"></p>
    
            </div>
            </form>
        {{ all_products }}
    </div>
    
            <table>
                <thead>
                <tr>
                    <td>Nom</td>
                    <td>Prix en euro</td>
                    <td>Nombre de calorie</td>
                    <td>Date</td>
                    <td>Quantite</td>
                    <td>Categorie</td>
                    <td>Type de Saisi</td>
                </tr>
                </thead>
                <tbody style="width:800px; height:400px; overflow:auto;">
                    {% for product in all_products %}
                        <tr>
                            <td>{{ product.name }}</td>
                            <td>{{ product.price }}</td>
                            <td>{{ product.calories }}</td>
                            <td>{{ product.date }}</td>
                            <td>{{ product.quantity }}</td>
                            <td>{{ product.category }}</td>
                            <td>
                                {% if product.toBuy %}
                                    <img src="/static/images/yes.png">
                                    {% else %}
                                    <img src="/static/images/No.png">
                                {% endif %}
                            </td>
                        </tr>
                    {% endfor %}
                </tbody>
                <tfoot>
                            <td></td>
                            <td>{{ sum_price }}</td>
                            <td>{{ sum_calories }}</td>
    
                </tfoot>
    
            </table>
            <p><a href="{% url "mealManager.views.data_entry" %}"><input type="submit", value="Enregistrer un produit..."></a></p>
    {% endblock %}



    -
    Edité par smiasaad 8 août 2015 à 22:50:46

    • Partager sur Facebook
    • Partager sur Twitter

    Django: Rrecherche avancée (multicritère)

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown