匹配查询不存在 Python Django

0 投票
2 回答
673 浏览
提问于 2025-04-17 19:50

我正在使用 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))

撰写回答