当模型不清楚时,如何在视图上指定get_absolute_url()?

时间:2012-04-06 02:34:15

标签: django permalinks

我在我的Django应用程序中有一个位置,我需要在第三方认证后构建对我的域的回调,但我仍然坚持如何执行此操作,因为该视图并未真正映射到一个model(或者更确切地说,视图代码引用多个模型),以及get_absolute_url()构造的文档和永久链接所有参考模型。

例如,在我的模板中,我目前有类似的内容:

<a class="btn btn-danger large" href="http://to/third/party?api_key=noneyobiz&cb=http://localhost:8000/signup">Join via Somethingorother</a>

urls.py中此视图的行是:

    url(r'^signup/$', 'signup', name="signup"),

我希望硬编码的“http:// localhost:8000 / signup”是动态的。我希望这个功能不依赖于我使用通用视图。实际上我不明白为什么生成永久链接甚至根本不依赖于模型,似乎它应该只依赖于urlconf。我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

permalink仅适用于 直接引用模型的用例。要查找非基于模型的网址,您可以使用url标记 - 在您的情况下为{% url signup %}

答案 1 :(得分:1)

permalinkdjango.core.urlresolvers.reverse的精简包装。它属于django.db.models是一个快捷方式,因为我们通常在reverse模型中编写get_absolute_url。所以在这里使用反向

from django.core.urlresolvers import reverse
path = reverse('signup')

更新

要使用绝对URI,您可以

  • 设置中的硬编码或使用Site.objects.get_current()之类的内容,以及从reverseurl获取绝对URI的路径,如Daniel建议的那样。
  • 如果您的回调URI与呈现模板的视图位于同一个域中,您可以依靠request来获取实际的绝对URI:

    request.build_absolute_uri(reverse('signup'))

此外,您可能希望转义template中的URI,例如{{ absolute_uri|urlencode }}。或通过urllib.quoteurllib.urlencode

查看