Vous n'êtes pas identifié(e).
Bonjour,
Je souhaite créer un formulaire de recherche afin de retrouver des éléments dans ma base de données.
Pour cela j'ai créé un simple formulaire avec une zone de saisie dans ma page search.html
Voici ce que cela donne :
{% extends "base.html" %}
{% load static %}
{% block content %}
<form method="POST" action="search">{% csrf_token %}
<table border:0px>
<tr>
<td>{{ formSearch.nom.label }}</td>
<td>{{ formSearch.nom }}</td>
</tr>
</table>
<p><input type="submit" value="Rechercher" name="search"/></p>
</form>
{% if result %}
{% for c in result %}
<a href= '/customers/record/{{ c.id }}'>{{ c.nom }}</a><br>
{% endfor %}
{% endif %}
{% endblock %}
Dans views.py j'ai cette fonction :
def search(request):
ctx = mainCtx
result = []
if request.method == 'POST':
print(request.POST)
if request.POST.get('nom'):
val = request.POST.get('nom')
for c in Customers.objects.filter(nom__icontains = val):
result.append(c)
ctx['result'] = result
ctx['formSearch'] = FormSearch()
return render(request, 'customer/search.html', ctx)
Lorsque je lance la commande python manage.py runserver, que je clique sur le lien me permettant d'accéder à la page search.html tout ce passe bien.
Ma recherche se fait correctement et je peux accéder à la page d'un client en cliquant sur son nom.
Par contre si je reclique sur le lien me permettant d'accéder à search.html, j'ai le message d'erreur suivant :
*Error during template rendering*
In template /home/charlie/Development/projet/projet/templates/customer/search.html, error at line *42*
*'Customers' object is not iterable*
*32*
</tr>
*33*
*34*
*35*
</table>
*36*
*37*
*38*
<p><input type="submit" value="Rechercher" name="search"/></p>
*39*
</form>
*40*
*41*
*42*
*{% for c in result %}*
*43*
<a href= '/customers/record/{{ c.id }}'>{{ c.nom }}</a><br>
*44*
{% endfor %}
*45*
*46*
*47*
<br><br>
*48*
*49*
*50*
*51*
*52*
Je cherche d'où cela peut venir mais je ne trouve pas.
Quelqu'un aurait-il une idée ou éventuellement un exemple d'une autre manière de faire ce que je cherche ?
D'avance merci
Charlie
Hors ligne
bonjour,
Peut-etre que je goure mais j'ai l'impression que le result est toujours
présent dans le context (peut-etre l'effet de ctx=mainCtx) alors qu'il
devrait être remis en à plat pour la recherche à venir.
du coup je changerai l'indentation de ctx['result'] = result pour le
mettre au même niveau que ctx['formSearch'] = FormSearch()
ainsi quand on arrive sur la page pour la première fois (ou une nouvelle
fois) result est remis à [] si on arrive sur la page via un post on
récupère potentiellement le QuerySet qui est parcouru par le for.
Cordialement
Le 16.09.2014 15:37, Charlie Gentil a écrit :
> Bonjour,
>
> Je souhaite créer un formulaire de recherche afin de retrouver des éléments dans ma base de données.
>
> Pour cela j'ai créé un simple formulaire avec une zone de saisie dans ma page search.html
>
> Voici ce que cela donne :
>
> {% extends "base.html" %}
>
> {% load static %}
>
> {% block content %}
>
> <form method="POST" action="search">{% csrf_token %}
>
> <table border:0px>
>
> <tr>
>
> <td>{{ formSearch.nom.label }}</td>
>
> <td>{{ formSearch.nom }}</td>
>
> </tr>
>
> </table>
>
> <p><input type="submit" value="Rechercher" name="search"/></p>
>
> </form>
>
> {% if result %}
>
> {% for c in result %}
>
> <a href= '/customers/record/{{ c.id }}'>{{ c.nom }}</a><br>
>
> {% endfor %}
>
> {% endif %}
>
> {% endblock %}
>
> Dans views.py j'ai cette fonction :
>
> def search(request):
>
> ctx = mainCtx
>
> result = []
>
> if request.method == 'POST':
>
> print(request.POST)
>
> if request.POST.get('nom'):
>
> val = request.POST.get('nom')
>
> for c in Customers.objects.filter(nom__icontains = val):
>
> result.append(c)
>
> ctx['result'] = result
>
> ctx['formSearch'] = FormSearch()
>
> return render(request, 'customer/search.html', ctx)
>
> Lorsque je lance la commande python manage.py runserver, que je clique sur le lien me permettant d'accéder à la page search.html tout ce passe bien.
>
> Ma recherche se fait correctement et je peux accéder à la page d'un client en cliquant sur son nom.
>
> Par contre si je reclique sur le lien me permettant d'accéder à search.html, j'ai le message d'erreur suivant :
>
> Error during template rendering
>
> In template /home/charlie/Development/projet/projet/templates/customer/search.html, error at line 42
>
> 'Customers' object is not iterable
>
> 32
>
> </tr>
>
> 33
>
> 34
>
> 35
>
> </table>
>
> 36
>
> 37
>
> 38
>
> <p><input type="submit" value="Rechercher" name="search"/></p>
>
> 39
>
> </form>
>
> 40
>
> 41
>
> 42
>
> {% for c in result %}
>
> 43
>
> <a href= '/customers/record/{{ c.id }}'>{{ c.nom }}</a><br>
>
> 44
>
> {% endfor %}
>
> 45
>
> 46
>
> 47
>
> <br><br>
>
> 48
>
> 49
>
> 50
>
> 51
>
> 52
>
> Je cherche d'où cela peut venir mais je ne trouve pas.
>
> Quelqu'un aurait-il une idée ou éventuellement un exemple d'une autre manière de faire ce que je cherche ?
>
> D'avance merci
>
> Charlie
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django [1]
Links:
------
[1] http://lists.afpy.org/mailman/listinfo/django
Hors ligne