0

我在 Windows Vista 上使用 Python 2.7 在 Django 1.4.3 中编程,制作一个提供产品的网站。所以我的/productos子页面中列出了各种产品。现在我正在尝试显示/producto/#包含列出产品的页面的页面。这是 my 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'),
)

我还有一个singleProduct_view功能views.py可以检索该产品并将其提供给我的网站。

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', it gave meproducto 匹配查询不存在` 错误。似乎是什么问题?

4

2 回答 2

0

那么问题很可能是您正在使用 unicode 字符串查询 Integerfield,但是按照建议更改 url 可能无法帮助您摆脱错误。因为您仍然会以字符串形式获取参数。

但是,您应该将参数 id_prod 转换为 int 并确保您在数据库中确实有一个 id = 2 的实体

于 2013-03-21T03:16:43.263 回答
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))
于 2013-03-21T02:29:22.873 回答