我怎么能得到完整/绝对的URL(例如https://example.com/some/path)在Django没有网站模块?这太愚蠢了……我不需要查询我的数据库来抓取URL!

我想使用reverse()。


当前回答

如果有人对在模板中获取带有参数的绝对反向url感兴趣,最简单的方法是通过扩展和使用现有默认代码来创建您自己的{% url %}模板标记的绝对版本。

这是我的代码:

from django import template
from django.template.defaulttags import URLNode, url

register = template.Library()

class AbsURLNode(URLNode):
    def __init__(self, view_name, args, kwargs, asvar):
        super().__init__(view_name, args, kwargs, asvar)

    def render(self, context):
        url     = super().render(context)
        request = context['request']

        return request.build_absolute_uri(url)


@register.tag
def abs_url(parser, token):

    urlNode = url(parser, token)
    return AbsURLNode( urlNode.view_name, urlNode.args, urlNode.kwargs, urlNode.asvar  )

在模板中的使用:

{% load wherever_your_stored_this_tag_file %}
{% abs_url 'view_name' parameter %}

将渲染(示例):

http://example.com/view_name/parameter/

而不是

/view_name/parameter/

其他回答

还有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()

子类化它,现在你可以在任何地方使用它。

如果你想使用reverse(),你可以这样做:request。build_absolute_uri(反向(view_name, args = (obj。pk,)))

<div class='col-12 col-md-6'>
    <p class='lead'>Login</p>
    {% include 'accounts/snippets/form.html' with form=login_form next_url=request.build_absolute_uri %}
</div>

例如,在这里,我说加载表单,并告诉表单,下一个URL是当前的URL,这段代码呈现

你可以传递request reverse('view-name', request=request)或者用build_absolute_uri将reverse()包含进来request.build_absolute_uri(reverse('view-name'))

你可以试试"request.get_full_path()"