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

标签 python django django-admin

我有一个联盟计划应用程序,具有重定向和链接统计跟踪功能。 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/

相关文章:

Django 自定义管理操作 : how to deselect on completion?

python - 使用 gmail 在 R 中通过电子邮件发送附件

python - Django:获取 TabularInline 模型对象

python - Python中具有不同长度的列表列表中元素的总和

javascript - jQuery + Django : get data from HTML table

python - 测试 Django 内联模型表单 : How to arrange POST data?

django - 在 nginx/gunicorn/django Web 架构中有效处理长时间运行的 HTTP 连接

django - Django关系

python - 如何获取正则表达式来捕获 "x dollar(s) and x cents"?

python - 如何使整数大于任何其他整数?