2009-11-06 3 views
0

J'ai une application de contact/adresse qui permet aux utilisateurs de rechercher des entrées de contact dans la base de données. La vue actuelle retourne un objet (Entrée()) et affiche ses champs. Le code est le suivant:gérer plusieurs objets retournés

def search_page(request): 
    form = SearchForm() 
    entrylinks = [] 
    show_results = True 
    if request.GET.has_key('query'): 
     show_results = True 
     query = request.GET['query'].strip() 
     if query: 
      form = SearchForm({'query' : query}) 
      entrylinks = \ 
       Entry.objects.filter (name__icontains=query)[:10] 
    variables = RequestContext(request, { 'form': form, 
     'entrylinks': entrylinks, 
     'show_results': show_results 
    }) 
    return render_to_response('search.html', variables) 

Je voudrais ajouter un « si » à la vue qui reconnaîtrait quand il y a plusieurs objets retournés (personnes ayant le même nom dans la base de données) et une telle cas, détournez les objets retournés vers un modèle différent (qui énumérerait simplement les objets retournés afin que l'utilisateur puisse choisir celui qu'il préfèrerait). Quelqu'un peut-il montrer à quoi ressemblerait une telle déclaration? Merci.

Répondre

2

L'objet renvoyé par Entry.objects.filter (un QuerySet) a une longueur, ce qui signifie que vous pouvez appeler len(entrylinks) pour obtenir le nombre d'enregistrements renvoyés. Ainsi, vous pouvez faire quelque chose comme ceci:

if len(entrylinks) == 1: 
    tpl = "search.html" 
else: 
    tpl = "select.html" 
variables = RequestContext(request, { 
    "form": form, 
    "entrylinks": entrylinks, 
    "show_results": show_results, 
}) 
return render_to_response(tpl, variables) 
+0

génial. merci beaucoup mipadi. apprécié. – kjarsenal

1

Plutôt que d'utiliser len (entrylinks), vous devez utiliser entrylinks.count(). La méthode de comptage intégrée est beaucoup plus rapide et peut vous sauver une requête de base de données.

+1

Est-ce que 'entrylinks.count()' ne génère pas de requête de base de données _another_? 'count()' fait un 'SELECT COUNT (*) ...' dans les coulisses. – mipadi

+0

D'accord avec mipadi. Dans ce cas, 'len' est en fait plus efficace, car vous aurez besoin d'évaluer le jeu de requête de toute façon dans votre template. –

+0

Merde, vous avez raison. Je pensais à tout faux. –

Questions connexes