【问题标题】:ValueError when getting objects by id通过 id 获取对象时出现 ValueError
【发布时间】:2012-07-01 03:42:28
【问题描述】:

我试图在我的 django 应用程序中按 id 获取数据。问题是我不知道用户将点击的 id 类型。我在视图中输入以下代码。

观看次数

def cribdetail(request, meekme_id):
    post=Meekme.objects.get(id=meekme_id)
    return render_to_response('postdetail.html',{'post':post, 'Meekme':Meekme},context_instance=RequestContext(request))

网址配置

url(r'^cribme/(?P<meekme_id>)\d+/$', 'meebapp.views.cribdetail', name='cribdetail'),

在模板中:

<a href="{% url cribdetail post.id %}">{{ result.object.title }}</a> 

当我点击模板中的上述链接时,出现以下错误:

ValueError at /cribme/0/

invalid literal for int() with base 10: ''

Request Method:     GET
Request URL:    http://127.0.0.1:8000/cribme/0/
Django Version:     1.4
Exception Type:     ValueError
Exception Value:    

invalid literal for int() with base 10: ''

Exception Location:     C:\Python27\lib\site-packages\django\db\models\fields\__init__.py in get_prep_value, line 537
Python Executable:  C:\Python27\python.exe
Python Version:     2.7.3

一直在与此作斗争。我怎样才能摆脱这个错误?

【问题讨论】:

  • @DanielRoseman:不完全是,这里有不同的问题,正则表达式有错误(空组)。
  • 另外,直接使用'get'方法来获取对象其实并不是一个好主意。最佳做法是使用 django 快捷方式 get_object_or_404。

标签: python django django-views django-urls


【解决方案1】:

除了 URL 问题之外,您首先没有生成正确的链接 - 您在模板中引用了 result.object.titlepost.id,这就是为什么您的 URL 包含 0 作为 ID。我猜你的意思是result.idresult.object.id

【讨论】:

    【解决方案2】:

    您的 urlconf 中的正则表达式需要稍作调整:

    url(r'^cribme/(?P<meekme_id>\d+)/$', 'meebapp.views.cribdetail', name='cribdetail'),
    

    meekme_id 参数的值未被捕获,因为 \d+ 在括号之外。

    【讨论】:

      【解决方案3】:

      在我看来,你的 urlconf 是罪魁祸首,应该是:

      url(r'^cribme/(?P<meekme_id>\d+)/$', 'meebapp.views.cribdetail', name='cribdetail'),
      

      不是:

      url(r'^cribme/(?P<meekme_id>)\d+/$', 'meebapp.views.cribdetail', name='cribdetail'),
      

      ?P&lt;meekme_id&gt; 的意思是“在括号之间给出匹配的字符串这个名称。() 不匹配任何内容,这就是为什么您的应用在尝试查找 ID 为 '' 的项目时会出错的原因。

      当括号括起来 \d+ 时,您匹配一个自然数,这应该可以。

      【讨论】:

        【解决方案4】:

        你放错了右括号:

        url(r'^cribme/(?P<meekme_id>\d+)/$', 'meebapp.views.cribdetail', name='cribdetail'),
        

        请注意,(?P&lt;meekme_id&gt; .. ) 组结构应包含您尝试匹配的 \d+ 字符。在您不正确的正则表达式中,您定义了一个不包含任何匹配字符的组,因此始终为空字符串 ''

        【讨论】:

        • 你们摇滚!!!非常感谢.. @Daniel result.object.id 有效.. 再次.. 非常感谢!!!!
        猜你喜欢
        • 2011-09-03
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 2016-04-30
        • 2011-10-06
        • 2012-06-30
        相关资源
        最近更新 更多