匹配查询不存在 Python Django
我正在使用 Django 1.4.3 和 Python 2.7 在 Windows Vista 上编程,制作一个提供产品的网站。在我的 /productos
子页面上列出了各种产品。现在我想显示 /producto/#
这个页面,来展示具体的产品。这里是我的 urls.py
文件,它就像是我网站页面的目录:
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('demo.apps.home.views',
url(r'^$','index_view', name = 'vista_principal'),
url(r'^about/$','about_view', name = 'vista_about'),
url(r'^productos/$','productos_view', name = 'vista_productos'),
url(r'^producto/(?P<id_prod>.*)/$', 'singleProduct_view',
name = 'vista_single_producto'),
url(r'^contacto/$','contacto_view', name = 'vista_contacto'),
url(r'^login/$', 'login_view', name = 'vista_login'),
url(r'^logout/$', 'logout_view', name = 'vista_logout'),
)
我在 views.py
文件中还有一个 singleProduct_view
函数,它负责获取产品信息并把它展示在我的网站上。
def singleProduct_view(request, id_prod):
prod = producto.objects.get(id = id_prod)
ctx = {'producto':prod}
return render_to_reponse('home/SingleProducto.html', ctx,
context_instance = RequestContext(request))
但是,当我输入 /producto/2
时,出现了一个错误,提示“没有匹配的产品”。这可能是什么问题呢?
2 个回答
0
问题可能出在你用一个Unicode字符串去查询一个整数字段上。不过,按照建议更改网址可能并不能解决这个错误,因为你得到的参数还是字符串。
不过,你应该把参数id_prod转换成整数,并且确保数据库中确实有一个id为2的实体。
0
我建议你把产品页面的链接改成下面这样
url(r'^producto/(?P<id_prod>\d+)/$', 'singleProduct_view',
name = 'vista_single_producto')
很可能你用的正则表达式 .* 匹配到了一个字符串,所以在你的 singleProduct_view 里,id_prod 实际上是一个字符串,而不是数字
** 编辑 **
然后在你的视图里,你需要把 id_prod 转换成一个整数
def singleProduct_view(request, id_prod):
prod = producto.objects.get(id = int(id_prod))
ctx = {'producto':prod}
return render_to_reponse('home/SingleProducto.html', ctx,
context_instance = RequestContext(request))
你还可以使用 get_object_or_404 来确保你的对象在数据库中确实存在。这样会改变你的视图,变成这样
from django.shortcuts import render, get_object_or_404
def singleProduct_view(request, id_prod):
prod = get_object_or_404( producto, id = int(id_prod) )
ctx = {'producto':prod}
return render_to_reponse('home/SingleProducto.html', ctx,
context_instance = RequestContext(request))