我試圖從我的數據庫表中搜索信息。在該網站上,我正在爲用戶輸入一些文本到搜索框中,並提供結果列表,然後他們可以單擊以查找更多信息。現在事情多數民衆贊成絆倒我的是,我能得到這個用下面的代碼工作完美:Django原始SQL未獲取ID
views.py
from models import Person
from django.template.loader import get_template
from django.template import Context
def search(request):
q = request.GET.get("q")
if q:
results = Person.objects.filter(name__icontains=q)
else:
results = Person.objects.all()
context = dict(results=results, q=q)
return render(request, "results.html", context)
models.py
from django.db import models
from django.db import connection
class Person(models.Model):
name = models.TextField()
job = models.TextField()
website = models.TextField()
def __unicode__(self):
return self.name
urls.py
from django.conf.urls import patterns, include, url
from django.views.generic import ListView, DetailView
from search.models import Person
urlpatterns = patterns('',
url(r'^$', ListView.as_view(
queryset=Person.objects.all(),
template_name="search.html")),
url(r'^(?P<pk>\d+)/$', DetailView.as_view(
model=Person,
template_name="single.html")),
url(r'^results/$', 'search.views.search'),
)
結果片段
{% for person in results %}
<li class="list-group-item"><a href="/search/{{person.id}}">{{ person.title }}</a></li>
{% endfor %}
它的工作原理,但我發現我需要改變一些文本到通配符,所以我需要去SQL路由。下面是不同的代碼:
views.py
from django.shortcuts import render
from models import Person
import re
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
from django.db import connection
def search(request):
q = request.GET.get("q")
moddedq = re.sub(r"(\s\d\s)","%",q)
cursor = connection.cursor()
cursor.execute('''SELECT * FROM search_person WHERE name LIKE %s''', [moddedq])
row = cursor.fetchone()
context = dict(results=results, q=q, moddedq=moddedq, row=row)
return render(request, "results.html", context)
結果片斷
{% for person in row %}
<li class="list-group-item"><a href="/search/{{person.id}}">{{ person.title }}</a></li>
{% endfor %}
然而,只是創建了人員信息的每個部分的列表,而最初的代碼只是顯示名稱,點擊名稱後可獲得額外的信息。我注意到ID沒有被從SQL中拉出來,所以我試圖創建的超鏈接會返回到搜索頁面。我的兩個主要問題是:
ID不被拉 出現在列表
任何幫助非常感謝所有的用戶信息。
感謝
我看不到任何理由在這裏使用原始的SQL; 'Person.objects.filter(name__icontains = q)'完全可以工作。 –