2010-10-25 5 views
0

Bonjour je travaille dans django comment utiliser un formulaire de recherche du site de documents Django. Voici quelques informations ci-dessous. Maintenant, y a-t-il un moyen de produire une partie de recherche de titre? Par exemple, si je voulais rechercher un livre intitulé "Apress", mais au lieu de taper le mot entier, je viens d'écrire "ap" pour obtenir Apress. Existe-t-il un moyen de parvenir à cette solution?Modifier une vue de recherche dans Django

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

    #views.py 
    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("books/search.html", { 
      "results": results, 
      "query": query 
     }) 

    #search html 

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
    <html lang="en"> 
    <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 }}</l1> 
      {% endfor %} 
      </ul> 
     {% else %} 
      <p>No books found</p> 
     {% endif %} 
     {% endif %} 
    </body> 
    </html> 
+0

Quel est le problème avec le code que vous avez? –

+0

Rien, mais je veux effectuer des recherches de pièces. Par exemple, si je voulais chercher le titre d'un livre intitulé "Harry Potter", je veux pouvoir taper "ha" ou "har" ou autrement pour le voir. – Shehzad009

Répondre

1

Si vous voulez faire correspondre au début d'un champ, vous pouvez utiliser startswith ou istartswith si vous voulez qu'il soit sensible à la casse. icontains que vous utilisez maintenant permettra des correspondances même à l'intérieur des chaînes, à savoir. 'arry' correspondra à 'Harry'. Alors que startswith permettra à 'Har' de correspondre à 'Harry', mais pas 'ArHarHar'

+0

Oui ce que je cherchais merci. Si j'utilisais des nombres plutôt que des caractères normaux, cela fonctionnerait-il aussi bien avec startswith qu'avec autre chose. Laissez-moi vous expliquer un exemple. Supposons que je veuille rechercher un nombre "1200" mais je voulais seulement taper "12" pour obtenir "1200". – Shehzad009

+0

Si le champ est un champ de caractère et que vous recherchez la chaîne "12" au lieu du numéro 12, alors oui cela fonctionnerait. Cependant, si le champ est un champ entier quelconque, je ne sais pas si l'utilisation de startswith fonctionnera, probablement pas. – knutin

+0

Oui, c'est ce que j'ai dit, car s'il y a un champ entier qui ne fonctionnerait probablement pas. La seule chose à laquelle je peux penser est le code dur à travers les vues pour être en mesure de le faire, mais cela peut être trop complexe. – Shehzad009

Questions connexes