Django 1.6 reverse()失败,异常值中缺少kwarg值

时间:2014-06-10 05:59:20

标签: python django django-admin

我有一个联盟计划应用程序,包含重定向和链接统计信息跟踪。 Django Admin中的只读字段应显示联盟链接的完整URL(因此用户可以将其复制+粘贴到他们的编辑器中),但模型实例中的reverse()调用get_absolute_url()调用urlpatterns = patterns( '', url(r'^a/', include('shop.affiliates.urls', namespace='affiliates')), ... 1}}方法在从admin类中的callable调用时失败。例如:

项目urls.py 中的

urlpatterns = patterns(
    '',
    url(r'^(?P<slug>[\w]+)/$', redirect_to_affiliate_link, name='affiliate_redirect'),

来自shop.affiliates.urls.py

class AffiliateLink(models.Model):
    ...
    slug = models.SlugField(
        max_length=4,
        help_text='The slug for this link, used to generate url.',
    )
    ...
    def get_absolute_url(self):
        return reverse(
            'affiliates:affiliate_redirect',
            kwargs={'slug': self.slug},
        )

来自shop.affiliates.models.py

slug

注意:为了简化调试,可以安全地假设先前已在数据库中填充了slug字段。所以我并没有尝试创建一个尚未设置class AffiliateLinkInline(admin.StackedInline): model = AffiliateLink extra = 0 fields = ( ..., 'hyperlink', ... ) readonly_fields = ( 'hyperlink', ... ) def hyperlink(self, obj): url = 'http://example.com{}'.format(obj.get_absolute_url()) return '<a href="{0}">{0}</a>'.format(url) hyperlink.allow_tags = True 的新对象。

来自shop.affiliates.admin.py

NoReverseMatch

加载相应的管理页面时,我收到Reverse for 'affiliate_redirect' with arguments '()' and keyword arguments '{u'slug': u''}' not found. 1 pattern(s) tried: [u'a/(?P<slug>[\\w]+)/$']例外。 例外值: obj.slug

所以找到了正确的正则表达式,但是slug参数是空的。我验证了admin callable中的AffiliateLink是否存在,并且它是正确的get_absolute_url() slug。更奇怪的是,如果我像def get_absolute_url(self): return reverse( 'affiliates:affiliate_redirect', kwargs={'bug': self.slug}, ) 那样切换kwargs:

Reverse for 'affiliate_redirect' with arguments '()' and keyword arguments '{u'bug': u'7aeB'}' not found. 1 pattern(s) tried: [u'a/(?P<slug>[\\w]+)/$']

然后异常值变为:

{{1}}

所以关键词&#39;的kwarg值。从异常值中消失,但是&#39; bug&#39;的值停留。

我在这里做错了什么?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

在加载URLconf之前,有时会评估URL模式。请尝试使用reverse_lazy代替reverse

https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy