我有一个联盟计划应用程序,具有重定向和链接统计跟踪功能。 Django 管理中的只读字段应显示附属链接的完整 URL(以便用户可以将其复制并粘贴到编辑器中),但 reverse()
调用模型实例的get_absolute_url()
从管理类中的可调用对象调用时,方法失败。例如:
来自项目 urls.py
urlpatterns = patterns(
'',
url(r'^a/', include('shop.affiliates.urls', namespace='affiliates')),
...
来自 shop.affiliates.urls.py
urlpatterns = patterns(
'',
url(r'^(?P<slug>[\w]+)/$', redirect_to_affiliate_link, name='affiliate_redirect'),
)
来自 shop.affiliates.models.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},
)
注意:为了调试简单起见,可以安全地假设 slug
字段之前已填充到数据库中。所以我不想创建一个新对象,其中 slug
尚未设置。
来自 shop.affiliates.admin.py
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
异常(exception)。
异常值:
Reverse for 'affiliate_redirect' with arguments '()' and keyword arguments '{u'slug': u''}' not found. 1 pattern(s) tried: [u'a/(?P<slug>[\\w]+)/$']
因此找到了正确的正则表达式,但 slug 参数为空。我验证了obj.slug
在管理中可调用存在,并且它是正确的 AffiliateLink
蛞蝓。更奇怪的是,如果我在 get_absolute_url()
中切换 kwargs像这样:
def get_absolute_url(self):
return reverse(
'affiliates:affiliate_redirect',
kwargs={'bug': self.slug},
)
然后异常值更改为:
Reverse for 'affiliate_redirect' with arguments '()' and keyword arguments '{u'bug': u'7aeB'}' not found. 1 pattern(s) tried: [u'a/(?P<slug>[\\w]+)/$']
因此键“slug”的 kwarg 值从异常值中消失,但“bug”的值保留。
我在这里做错了什么?非常感谢任何帮助。
最佳答案
URL 模式有时会在加载 URLconf 之前进行评估。尝试用reverse_lazy
代替reverse
https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy
关于python - Django 1.6 reverse() 失败,异常值中缺少 kwarg 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24133876/