【问题标题】:NoReverseMatch in djangodjango中的NoReverseMatch
【发布时间】:2009-11-22 18:09:53
【问题描述】:

调试了一会发现是什么错误,但是不知道怎么解决。

  • 我有一个名为“ver_caja”的 urlConf,它接收 caja 对象的 id 作为参数,然后调用通用 object_detail
  • 查询集正确:正确获取所有 caja 对象。
  • 在模板中我有调用: {% ver_caja caja.id %}
  • 对象caja被模板正确接收。
  • 我正在使用 MySQL。

问题是caja.id 的值是“1L”而不是“1”

1L 引发错误,因为 urlconf (ver_caja) 等待整数而不是字母数字“<int>L”。

我在 django docs 网站上得到的所有信息都是这样的(作为教程中的一个例子),它没有帮助:

...

>>> p = Poll(question="What's up?", pub_date=datetime.datetime.now())

# Save the object into the database. You have to call save() explicitly.
>>> p.save() 

# Now it has an ID. Note that this might say "1L" instead of "1", depending 
# on which database you're using. That's no biggie; it just means your
# database backend prefers to return integers as Python long integer
# objects.
>>> p.id

...

那么,我该如何解决这个问题以接收caja.id=1 而不是caja.id=1L

提前致谢。

佩德罗

编辑:这里有所有文件。

模板错误:

渲染时遇到异常: 与“ver_caja_chica”相反 参数 '(1L,)' 和关键字 未找到参数“{}”。

caja/models.py

class Caja(models.Model):
    slug = models.SlugField(blank=True)
    nombre = models.CharField(max_length=20)
    saldo = models.DecimalField(max_digits=10, decimal_places=2)
    detalle = models.TextField(blank=True, null=True)

    # apertura
    fechahora_apert = models.DateTimeField(default=datetime.datetime.now, auto_now_add=True)
    usuario_apert = models.ForeignKey(Usuario, related_name=u'caja_abierta_por', help_text=u'Usuario que realizó la apertura de la caja.')

    # cierre
    fechahora_cie = models.DateTimeField(blank=True, null=True)
    usuario_cie = models.ForeignKey(Usuario, null=True, blank=True, related_name=u'caja_cerrada_por', help_text=u'Usuario que realizó el cierre de la caja.')

    def __unicode__(self):
        return u'%s,  $%s' % (self.nombre, self.saldo)

    class Meta:
        ordering = ['fechahora_apert']


class CajaChica(Caja):
    dia_caja = models.DateField(default=datetime.date.today, help_text=u'Día al que corresponde esta caja.')
    cerrada = models.BooleanField(default=False, help_text=u'Si la caja está cerrada no se puede editar.')

caja/urls.py

cajas_chicas = {
    'queryset': CajaChica.objects.all(),
}

urlpatterns = patterns('',
    url(r'^$', 'django.views.generic.list_detail.object_list', dict(cajas_chicas, paginate_by=30), name="lista_cajas_chicas"),
    url(r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', dict(cajas_chicas, ), name="ver_caja_chica"),
)

cajachica_list.html

...
<table>
{% for obj in object_list %}
<tr class="{% cycle 'row1' 'row2' %}">
    <td>{{ obj.nombre|capfirst }}</td>
    <td>{{ obj.fechahora_apert|timesince }}</td>
    <td>{{ obj.usuario_apert }}</td>
    <td>{{ obj.saldo }}</td>
    <td><a href="{% url ver_caja_chica obj.pk %}">Ver / Editar</a></td>
</tr>
{% endfor %}
</table>
...

EDIT-2 使用错误的 urlconf(故意),这些是此应用程序的 url:

... 
4. ^caja/$ ^$ 
5. ^caja/$ ^(?P<object_id>\d+)/$ 
... 

可能最终的 url 是 django 构造的错误。

这些 url 位于 caja/urls.py 中,并包含在项目根目录中的 urls.py 中。

有什么线索吗?

【问题讨论】:

  • urls.py 中的实际行添加到问题中 - 我认为这就是问题所在。 1L 只是 python 打印长整数的方式——我认为这不是问题。 >>> a = 1L >>> a 1L >>> str(a) '1' >>>
  • 我添加了所有的代码来调试。 :P 错误文本中似乎很清楚错误在参数('1L')中。如果这不是问题,那我不知道......
  • 尝试查看您为查询集获得的对象。都有一个长整数吗?您如何将其存储在数据库中?

标签: django url integer reverse


【解决方案1】:

您确定您已将此 URL 配置实际连接到您的主 URL 配置吗?

在您项目的 urls.py 中,确保您有类似以下内容:

urlpatterns = patterns('',
    #...
    url(r'^cajas/', include('caja.urls')),
)

【讨论】:

  • 伙计,这个错误很容易成为 django 历史上的新手和最愚蠢的错误。花了几天时间试图修复这个##$@!!!问题。所有这一切都是因为一个他妈的'$'!!!!!!我在根目录中的 urlconf 是:(r'^cajas/$', include('ceom.cajas.urls')),我从来没有意识到在我制作模型'cajas'之前剩下的'$'。我觉得自己像个白痴。谢谢。
  • +1 别担心,我使用 Django 已经很多年了,在我将视图分离到应用程序之前,我把 '$' 留在了那里。下次我点击 NoReverseMatch 时,我会第一次检查它是否匹配。
【解决方案2】:

问题根本不是你想的那样。参数显示为'(1L,)',因此元组中的值是一个整数,尽管它是一个长整数,而不是一个字符串,它会显示为'('1L',)'。 (L 的解释显示在您发布的代码的注释中)。

实际上,问题在于您的 URL 需要一个命名的关键字参数,而不是一个未命名的位置参数。这是因为您已将正则表达式组命名为:(?P&lt;object_id&gt;\d+)。所以url标签应该是:

{% url ver_caja_chica object_id=obj.pk %}

【讨论】:

  • 其实这没关系。您仍然可以对命名的正则表达式组使用位置参数。
  • @SmileyChris——如果参数的顺序与 URLConf 的预期不一致怎么办?我从来没能完成这项工作。在需要命名参数的地方传递位置参数。这是最安全、最可靠的做法。
  • @Daniel Roseman -- 笑脸是对的,这不是问题所在。我进行了您提出的更改,但错误仍然存​​在:“渲染时出现异常:'ver_caja_chica' 的反向参数'()'和关键字参数'{'object_id':1L}'未找到。” :S 谜团一直没有解决。
  • 使用错误的 urlconf(故意),这些是此应用程序的 url:... 4. ^caja/$ ^$ 5. ^caja/$ ^(?P\ d+)/$ ... 也许最终的 url 是 django 构造的错误。这些 url 位于 caja/urls.py 中,并包含在项目根目录中的 urls.py 中。有什么线索吗?
  • 问题已解决(url 包含器在模式末尾有一个“$”)。无论如何,感谢丹尼尔对“1L”的解释,我不知道。问候
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 2014-02-10
  • 2017-05-21
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多