Django-fr

Forum

#1 30-12-2010 16:58:21

beegees
Membre
Inscription : 26-12-2010
Messages : 66

Soucis avec la création d'un formulaire simple

Re-bonjour tout le monde,

Je suis un peu perdu.

J'étudie actuellement les formulaires.

Voici le code de mon template :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Search {% if query %} Results {% endif %}</title>
</head>
<body>
    <h1>Search</h1>
    <form action="." method="get">
        <label for="q">Search:</label>
        <input type="text" name="q" value="{{ query|escape }}">
        <input type="submit" value="Search">
    </form>
    {% if query %}
        <h2>Results for "{{ query|escape }}":</h2>
        {% if results %}
    <ul>
    {% for book in results %}
        <li>{{ book|escape }}</li>
    {% endfor %}
    </ul>
    {% else %}
    <p>No books found</p>
    {% endif %}
    {% endif %}

</body>
</html>

Plusieurs questions :

1) Je ne comprends pas du tout cette ligne de code

<title>Search {% if query %} Results {% endif %}</title>

.

Je me demande d'où vient ce Results

2) Dans le livre, l'auteur conseille de mettre "." pour l'action.  Comment Django sait que c'est search qui doit être utilisé pour compléter le gabarit ?
Je ne comprends pas bien l'utilité de ce point.

3) je ne comprends pas du tout ce for

<label for="q">Search:</label>

4) Je ne comprends pas bien le fonctionnement de ce gabarit.  Premièrement il affiche la zone de texte et le submit et ensuite le même gabarit affiche les résultats ?

5) lorsque j'appuie sur le submit, j'obtiens ce message d'erreur :

The view Temps.books.views.search didn't return an HttpResponse object.

Je renvoie pourtant un objet de type HttpResponse avec render_to_response.

Voici le code de ma vue :

# Create your views here.

from django.db.models import Q
from django.shortcuts import render_to_response
from models import Book

def search(request):
    query = request.GET.get('q','')
    if query:
        qset = (
            Q(title__icontains=query) |
            Q(authors__first_name__icontains=query) |
            Q(authors__last_name__icontains = query)
        )
        results = Book.objects.filter(qset).distinct()
    else:
        results= []
        return  render_to_response("inputs/search.html",{"results":results, "query":query})

6) je me demandais aussi à quoi correspondait "Book" ?

from models import Book

Merci d'avance pour votre aide.

beegees

Dernière modification par beegees (30-12-2010 17:28:05)

Hors ligne

#2 30-12-2010 22:24:05

afranck64
Membre
Inscription : 30-12-2010
Messages : 20

Re : Soucis avec la création d'un formulaire simple

Bonsoir,
1)- <title>Search {% if query %} Results {% endif %}</title>
Ceci signifie que le titre de la page sera "Search" + le contenu de 'Results', si query est différent de False,'',"",(),[],{},None et 0.
Ce qui est écrit entre {% if variable_ou_constante %} et {% endif %} n'est affiché que si le "if" est vérifié.
- la variable "Results" est une clef d'une dictionnaire/context utilisé pour traduire ton gabarit. Le contenu de "Results" est la valeur qui lui est associée dans le dictionnaire/context utilisé pour traduire le gabarit.

2)- Le "." c'est pour signaler que c'est à la page courante qu'il faut soumettre la requête. C'est un peu comme "dossier courant" avec les répertoires.

3)- <label for="q">Search:</label>
Le for moi non plus n'y comprends rien. Lorsque je le modifie ou l'enlève, je ne note pas différence j'en conclu donc qu'il doit être symbolique/décoratif.

4)- Tout se passe dans le {% if query % }.
Lorsque la page est appelée sans paramètre "q", La requete ne modifie pas query qui vaut "" ce qui fait que l'on entre pas de le {% if query %} et donc on est mode lecture de données.
De même lorsque query existe, on modifie le titre de la page en "Search" + " Results".

5)- Dans le bloc "if query" de ta vue/fonction "search", il n'y pas de return donc Python retourne None, qui n'est pas un objet HttpResponse ce qui lève une exception.

6)-"from models import Book"
Ceci est en fait le moyen d'accéder à la base de données. Il y a une correspondance entre Book et la table books_Book de la base de données. Ceci permettra d'effectuer les recherche en fonction du nom du livre entré par l'utilisateur.

Bonne nuit, ++

Dernière modification par afranck64 (30-12-2010 22:32:36)

Hors ligne

#3 31-12-2010 00:05:59

Bruno Renié
Membre
Inscription : 11-08-2010
Messages : 52

Re : Soucis avec la création d'un formulaire simple

Bonsoir,

2010/12/30 Franck Awounang N. <afranck64 _AT_ yahoo.fr>:
> 2)- Le "." c'est pour signaler que c'est à la page courante qu'il faut
> soumettre la requête. C'est un peu comme "dossier courant" avec les
> répertoires.

Ça marche bien avec Django quand les URLs se terminent par un "/".
Mais si la page est /search sans "/" à la fin, le fait de mettre "."
dans action enverra le formulaire sur / et non sur /search. Je pense
que c'est bien d'être explicite et de mettre l'URL complète dans
l'action, avec le tag {% url %} c'est assez facile.

> 3)- <label for="q">Search:</label>
> Le for moi non plus n'y comprends rien. Lorsque je le modifie ou
> l'enlève, je ne note pas différence j'en conclu donc qu'il doit être
> symbolique/décoratif.

Quand tu as un <label for="q"> et un <input id="q">, le fait de
cliquer sur le label mettra le focus sur l'input associé. Pratique
pour les champs de texte, c'est aussi utile pour les checkboxes /
boutons radio qui sont cochés / décochés quand on clique sur le label.
Django génère ça tout seul quand on fait un {{ form.as_p }} donc on ne
se rend pas compte de l'utilité smile

> 5)- Dans le bloc "if query" de ta vue/fonction "search", il n'y pas de
> return donc Python retourne None, qui n'est pas un objet HttpResponse ce
> qui lève une exception.

J'ai l'impression que c'est le "return" dans la dernière ligne de la
vue qui est indenté d'un cran de trop. En le remontant d'un niveau la
vue retournera toujours une (http)réponse.

Bruno

Hors ligne

#4 31-12-2010 09:00:31

afranck64
Membre
Inscription : 30-12-2010
Messages : 20

Re : Soucis avec la création d'un formulaire simple

Bonjour,

Bruno Renié a écrit :

J'ai l'impression que c'est le "return" dans la dernière ligne de la
vue qui est indenté d'un cran de trop. En le remontant d'un niveau la
vue retournera toujours une (http)réponse.
Bruno

Effectivement. smile

Hors ligne

#5 31-12-2010 09:04:16

beegees
Membre
Inscription : 26-12-2010
Messages : 66

Re : Soucis avec la création d'un formulaire simple

Salut,

Merci à vous deux pour vos réponses.

Tout est en ordre maintenant.

Bon réveillon ce soir.

beegees

Hors ligne

Pied de page des forums