我试图从搜索中获取数据库表中的信息。在网站上,我正在为用户工作,在搜索框中输入一些文本,并提供结果列表,然后他们可以单击以查找更多信息。现在让我感到困惑的是,我可以使用以下代码完美地完成这项工作:
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 %}
然而,这只会创建一个包含人员信息的每个部分的列表,而初始代码只显示名称,并且在点击名称时可以获得额外信息。我注意到没有从SQL中提取ID,因此我尝试创建的超链接只会返回到搜索页面。我的两个主要问题是:
ID未被拉动 所有用户信息都显示在列表中
非常感谢任何帮助。
由于
答案 0 :(得分:0)
fetchone()
返回tuple
,而不是
{% for person in row %}
<li class="list-group-item"><a href="/search/{{ person.0 }}">{{ person.1 }}</a></li>
{% endfor %}