2015-11-26 82 views
0

我試圖從我的數據庫表中搜索信息。在該網站上,我正在爲用戶輸入一些文本到搜索框中,並提供結果列表,然後他們可以單擊以查找更多信息。現在事情多數民衆贊成絆倒我的是,我能得到這個用下面的代碼工作完美: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不被拉 出現在列表

任何幫助非常感謝所有的用戶信息。

感謝

+0

我看不到任何理由在這裏使用原始的SQL; 'Person.objects.filter(name__icontains = q)'完全可以工作。 –

回答

0

fetchone()回報tuple,不能模擬

{% for person in row %} 
<li class="list-group-item"><a href="/search/{{ person.0 }}">{{ person.1 }}</a></li> 
{% endfor %} 
+0

非常感謝您通過切換到fetchall而不是fetchone它完全按照預期工作。我需要更多的代表upvote這個答案,但只要我得到它,我會回來!再次感謝! – Dof