2015-11-26 2 views
0

Я пытаюсь получить информацию из таблицы базы данных из поиска. На сайте, на котором я работаю, пользователь вводит какой-либо текст в поисковый запрос и получает список результатов, которые затем могут щелкнуть, чтобы найти дополнительную информацию. Теперь вещь то будет топтаться меня, я могу получить это прекрасно работает со следующим кодом:Django Raw SQL Not Getting 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'), 
) 

результаты snippet

{% 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 %} 

Однако это только создает список с каждой частью информации лиц, в то время как исходный код просто отображается имя и при нажатии на имя появилась дополнительная информация. Я заметил, что идентификатор не извлекается из SQL, поэтому гиперссылка, которую я пытаюсь создать, возвращает только на страницу поиска. Мои 2 основные вопросы:

ID не тянет Все данные пользователя, появляющийся в списке

Любая помощь очень ценится.

Благодаря

+0

Я не вижу никаких причин, чтобы использовать сырые SQL здесь; 'Person.objects.filter (name__contains = 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, он работает точно так, как предполагалось. Мне нужно больше репутации, чтобы поддержать этот ответ, но как только я получу его, я вернусь! Еще раз спасибо! – Dof