如何https://example.com/some/path在没有Sites模块的情况下获取 Django中的完整/绝对URL(例如)?那真是太傻了......我不需要查询我的数据库来获取URL!
我想用它reverse().
Dmi*_*nko 484
根据请求使用方便的request.build_absolute_uri()方法,将相关网址传递给它,它会给你一个完整的.
默认情况下,request.get_full_path()返回绝对URL ,但您可以将相对URL作为第一个参数传递给它,以将其转换为绝对URL.
小智 85
如果你想和它一起使用,reverse()你可以这样做:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
Dar*_*arb 56
您还可以将其get_current_site用作网站app(from django.contrib.sites.models import get_current_site)的一部分.它接受一个请求对象,SITE_ID如果请求是,则默认为您在settings.py中配置的站点对象None.有关使用站点框架的文档,请阅读更多内容
例如
from django.contrib.sites.shortcuts import get_current_site
request = None
full_url = ''.join(['http://', get_current_site(request).domain, obj.get_absolute_url()])
Run Code Online (Sandbox Code Playgroud)
它不像紧凑/整洁request.build_absolute_url(),但它可用于请求对象不可用,并且您有一个默认的站点URL.
sha*_*ker 53
如果您无法访问,request则无法get_current_site(request)在此处使用某些解决方案中的建议.您可以使用本机站点框架的组合而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/'
Run Code Online (Sandbox Code Playgroud)
https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
sed*_*nym 19
如果您不想访问数据库,可以使用设置进行操作.然后,使用上下文处理器将其添加到每个模板:
# settings.py (Django < 1.9)
...
BASE_URL = 'http://example.com'
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.extra_context',
)
# settings.py (Django >= 1.9)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
# Additional
'myapp.context_processors.extra_context',
],
},
},
]
# myapp/context_processors.py
from django.conf import settings
def extra_context(request):
return {'base_url': settings.BASE_URL}
# my_template.html
<p>Base url is {{ base_url }}.</p>
Run Code Online (Sandbox Code Playgroud)
小智 14
这在我的模板中对我有用:
{{ request.scheme }}://{{ request.META.HTTP_HOST }}{% url 'equipos:marca_filter' %}
Run Code Online (Sandbox Code Playgroud)
我需要完整的 url 将它传递给 js fetch 函数。我希望这对你有帮助。
Fli*_*imm 13
django-fullurl如果你想做到这一点在Django模板,我已经发布了一个很小的安装包的PyPI django-fullurl让你更换url并static用模板标签fullurl和fullstatic,如下所示:
{% load fullurl %}
Absolute URL is: {% fullurl "foo:bar" %}
Another absolute URL is: {% fullstatic "kitten.jpg" %}
Run Code Online (Sandbox Code Playgroud)
这些徽章应该有希望自动保持最新:
在视图中,您当然可以使用request.build_absolute_uri.
lev*_*evi 10
在您看来,只需这样做:
base_url = "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)
Run Code Online (Sandbox Code Playgroud)
要从模板创建指向其他页面的完整链接,您可以使用以下命令:
{{ request.META.HTTP_HOST }}{% url 'views.my_view' my_arg %}
Run Code Online (Sandbox Code Playgroud)
request.META.HTTP_HOST给出主机名,url给出相对名称.然后模板引擎将它们连接成一个完整的URL.
还有另一种方式.你可以使用build_absolute_uri()你view.py,并把它传递给模板.
view.py
def index(request):
baseurl = request.build_absolute_uri()
return render_to_response('your-template.html', { 'baseurl': baseurl })
Run Code Online (Sandbox Code Playgroud)
您-template.html
{{ baseurl }}
Run Code Online (Sandbox Code Playgroud)
检查Request.META进来的字典.我认为它有服务器名称和服务器端口.
如果您使用的是 django REST 框架,则可以使用rest_framework.reverse. 这与 具有相同的行为django.core.urlresolvers.reverse,但它使用请求参数来构建完整的 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,))
Run Code Online (Sandbox Code Playgroud)
编辑以提及仅在 REST 框架中的可用性
小智 6
请尝试以下代码:
{{ request.scheme }}://{{ request.META.HTTP_HOST }}
Run Code Online (Sandbox Code Playgroud)
小智 5
我知道这是一个老问题.但我认为人们仍然会遇到这种情况.
有几个库可以补充默认的Django功能.我试了几个.反向引用绝对URL时,我喜欢以下库:
https://github.com/fusionbox/django-absoluteuri
我喜欢的另一个因为你可以轻松地将域,协议和路径放在一起是:
https://github.com/RRMoelker/django-full-url
该库允许您在模板中简单地编写您想要的内容,例如:
{{url_parts.domain}}
Run Code Online (Sandbox Code Playgroud)
如果有人有兴趣在模板中使用参数获取绝对反向 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 )
Run Code Online (Sandbox Code Playgroud)
在模板中的用法:
{% load wherever_your_stored_this_tag_file %}
{% abs_url 'view_name' parameter %}
Run Code Online (Sandbox Code Playgroud)
将渲染(示例):
http://example.com/view_name/parameter/
Run Code Online (Sandbox Code Playgroud)
代替
/view_name/parameter/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
246327 次 |
| 最近记录: |