我有一个联盟计划应用程序,包含重定向和链接统计信息跟踪。 Django Admin中的只读字段应显示联盟链接的完整URL(因此用户可以将其复制+粘贴到他们的编辑器中),但模型实例中的reverse()
调用get_absolute_url()
调用urlpatterns = patterns(
'',
url(r'^a/', include('shop.affiliates.urls', namespace='affiliates')),
...
1}}方法在从admin类中的callable调用时失败。例如:
urlpatterns = patterns(
'',
url(r'^(?P<slug>[\w]+)/$', redirect_to_affiliate_link, name='affiliate_redirect'),
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},
)
)
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
的新对象。
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;的值停留。
我在这里做错了什么?非常感谢任何帮助。
答案 0 :(得分:1)
在加载URLconf之前,有时会评估URL模式。请尝试使用reverse_lazy
代替reverse
https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy