django跨站点反转网址

时间:2010-04-06 16:17:33

标签: django django-urls resolve django-sites

我有一个类似django cross-site reverse的问题。但我认为我不能应用同样的解决方案。

我正在创建一个允许用户创建自己网站的应用。完成注册表单后,应将用户重定向到其站点的新帖子表单。这方面的事情:

        new_post_url = 'http://%s.domain:9292/manage/new_post %site.domain'
        logged_user = authenticate(username=user.username, password=user.password)
        if logged_user is not None:
            login(request, logged_user)
            return redirect(new_product_url)

现在,我知道“new_post_url”太糟糕了,让宝宝哭了所以我需要以某种方式扭转它。我想在使用 django.core.urlresolvers.reverse 来解决这个问题,但是只返回我的域名上的url,而不是用户新创建的站点中的url,所以它对我不起作用。

那么,你知道更好/更聪明的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

看起来域名是您自己网站的子域名,那么您无法撤消该部分的重要性是什么?使用reverse它不使用完整的域路径,它为您提供了项目根目录的路径,因此您可以执行以下操作:

new_post_uri = 'http://%s.domain:9292%s' % (site.domain, reverse('manage_new_post'))

通过这种方式,你仍然使用反向,所以你不会对网址进行硬编码(并让婴儿哭泣),而且就我所见,你并不是真的有问题。

最后,如果您不希望在代码中对您自己的域进行硬编码,请使用Django的Sites模型来获取当前站点,请确保将其从默认的example.com修改为您自己的域,因此最后你的代码可以是:

current_site = Site.objects.get_current() # See the docs for other options
return redirect('http://%s.%s%s' % (site.domain, current_site, reverse('manage_new_post')))

如果您需要在不使用Sites对象的情况下获取域名,最好的选择可能是request.get_host(),这将获得完整的域名加端口,但不会获得协议。

希望能为您解释一些事情。你可以把事情格式化得更好,但这就是它的要点。

答案 1 :(得分:0)

redirect也可选择将视图名称作为参数,因此,由于您已经拥有了所需的所有变量,因此只需传递包含所有必需参数的视图名称,并使用它完成,而不是尝试复杂的逆转!

如果您仍然需要反向性质,可能应该在网站模型上使用get_absolute_url。