2

我有一个与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,而不是用户新创建的站点,所以它对我不起作用。

那么,您知道解决此问题的更好/更智能的方法吗?

4

2 回答 2

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(),它将获取完整的域和端口,而不是协议。

希望这可以为您解释。你可以更好地格式化一些东西,但这就是它的要点。

于 2010-04-06T23:08:01.627 回答
0

redirect还可以选择将视图名称作为参数,因此,由于您已经拥有它所需的所有变量,只需传递带有所有必需参数的视图名称,然后就可以完成它,而不是尝试复杂的反向操作!

如果您仍然想要相反的性质,可能您应该使用站点模型上的 get_absolute_url。

于 2010-04-07T08:05:49.223 回答