2010-10-25 2 views
0

Здравствуйте, я работаю в django, как использовать форму поиска с сайта документов Django. Ниже приведена некоторая информация ниже. Теперь, есть способ, который я могу выполнить для поиска деталей для названия? Например, если бы я хотел найти книгу под названием «Apress», но вместо ввода всего слова я просто написал «ap», чтобы получить Apress. Есть ли способ достижения этого решения?Редактирование поиска в 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

Что не так с кодом, который у вас есть? –

+0

Ничего, но я хочу выполнить поиск частей. Например, если бы я хотел найти название книги под названием «Гарри Поттер», я бы хотел просто набрать «ha» или «har» или иначе увидеть его. – Shehzad009

ответ

1

Если вы хотите, чтобы соответствовать на начало поля, вы можете использовать startswith или istartswith, если вы хотите, чтобы это было чувствительно к регистру. icontains, который вы используете сейчас, позволит совпадения даже внутри строк, т.е. «arry» будет соответствовать «Гарри». В то время как startswith позволит «Хар» соответствовать «Гарри», но не «ArHarHar»

+0

Да, это я искал благодарности. Если бы я использовал цифры, а не обычные символы, он работал бы с startswith или другим. Позвольте мне объяснить пример. Предположим, хотел ли я искать номер «1200», но я хотел набрать «12», чтобы получить «1200». – Shehzad009

+0

Если поле является символьным полем, и вы ищете строку «12» вместо номера 12, то да, это сработает. Однако, если поле является целым полем какого-то типа, я не знаю, будет ли работать с использованием startswith, возможно, нет. – knutin

+0

Да, это то, что я сказал, потому что если есть целое поле, которое, вероятно, не сработает. Единственное, что я могу придумать, это жесткий код через представления, чтобы иметь возможность сделать это, но это может быть слишком сложно. – Shehzad009