我怎么能得到完整/绝对的URL(例如https://example.com/some/path)在Django没有网站模块?这太愚蠢了……我不需要查询我的数据库来抓取URL!
我想使用reverse()。
我怎么能得到完整/绝对的URL(例如https://example.com/some/path)在Django没有网站模块?这太愚蠢了……我不需要查询我的数据库来抓取URL!
我想使用reverse()。
当前回答
还有ABSOLUTE_URL_OVERRIDES可用作为设置
https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides
但这将覆盖get_absolute_url(),这可能是不可取的。
我认为更好的解决方案是把它放在models.py中,而不是仅仅为此安装sites框架,或者做一些这里提到的依赖于request对象的其他事情
在settings.py中定义BASE_URL,然后将其导入models.py并创建一个抽象类(或将其添加到您已经在使用的类中),该类定义get_truly_absolute_url()。它可以很简单:
def get_truly_absolute_url(self):
return BASE_URL + self.get_absolute_url()
子类化它,现在你可以在任何地方使用它。
其他回答
如果你不能访问request,那么你就不能像这里的一些解决方案中推荐的那样使用get_current_site(request)。您可以使用原生Sites框架和get_absolute_url的组合。在管理中设置至少一个站点,确保你的模型有一个get_absolute_url()方法,然后:
>>> from django.contrib.sites.models import Site
>>> domain = Site.objects.get_current().domain
>>> obj = MyModel.objects.get(id=3)
>>> path = obj.get_absolute_url()
>>> url = 'http://{domain}{path}'.format(domain=domain, path=path)
>>> print(url)
'http://example.com/mymodel/objects/3/'
https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
还有ABSOLUTE_URL_OVERRIDES可用作为设置
https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides
但这将覆盖get_absolute_url(),这可能是不可取的。
我认为更好的解决方案是把它放在models.py中,而不是仅仅为此安装sites框架,或者做一些这里提到的依赖于request对象的其他事情
在settings.py中定义BASE_URL,然后将其导入models.py并创建一个抽象类(或将其添加到您已经在使用的类中),该类定义get_truly_absolute_url()。它可以很简单:
def get_truly_absolute_url(self):
return BASE_URL + self.get_absolute_url()
子类化它,现在你可以在任何地方使用它。
如果你使用的是django REST框架,你可以使用rest_framework.reverse中的反向函数。这与django.core.urlresolvers的行为相同。相反,除了它使用一个请求参数来构建一个完整的URL。
from rest_framework.reverse import reverse
# returns the full url
url = reverse('view_name', args=(obj.pk,), request=request)
# returns only the relative url
url = reverse('view_name', args=(obj.pk,))
经过编辑,只提到REST框架中的可用性
检查请求。META字典。我认为它有服务器名和服务器端口。
我遇到这个线程是因为我正在寻找为成功页面构建一个绝对URI。request.build_absolute_uri()给了我当前视图的URI,但为了获得我的成功视图的URI,我使用了以下....
request.build_absolute_uri(反向(success_view_name))