get_absolute_url 中的 django 完整 url

Posted

技术标签:

【中文标题】get_absolute_url 中的 django 完整 url【英文标题】:django full url in get_absolute_url 【发布时间】:2011-04-28 23:41:54 【问题描述】:

当我在模板中调用我的模型 get_absolute_url 方法时,我想要一个绝对/完整的 url。在我的入门模型中,我有以下内容:

def get_absolute_url(self):
    return ('blog_entry_detail', (),  'year': self.pub_date.strftime("%Y"),
                                           'month': self.pub_date.strftime("%b").lower(),
                                           'day': self.pub_date.strftime("%d"),
                                           'slug': self.slug )

get_absolute_url = models.permalink(get_absolute_url)

在我的模板文件中:

object.get_absolute_url

我想输出前缀为“http://www.example.com”的网址

我想使用下面几行来获取当前的域名,但我不知道我会把它放在哪里。

from django.contrib.sites.models import Site
current_site = Site.objects.get_current().domain

【问题讨论】:

这里对这个问题有一个很好的答案,你可以调整它以在你的模型上提供一个方法(注意你可能需要将请求对象作为额外的上下文传递给模板):***.com/questions/2345708/… 【参考方案1】:

由于我没有找到任何最新的答案,因此我通过以下方式获得了结果:

在settings.py中,我设置BASE_URL,然后在models中设置get_absolute_url方法:

def get_absolute_url(self):
    from django.urls import reverse
    from django.conf import settings
    path = reverse('urlname', args=(arg)) # Assuming that a URL with name `urlname` is set in urls.py
    return ''.format(settings.BASE_URL, path)

我不知道这是否是获取完整 URL 的最佳方法,但我没有找到任何更好的方法来达到预期的结果。我希望这对某人有所帮助。

【讨论】:

【参考方案2】:

我的解决方案,站点框架

API\views.py

class NotificationSerializer(serializers.HyperlinkedModelSerializer):
    absolute_url = serializers.CharField(source='get_full_absolute_url', read_only=True)

    class Meta:
        model = Notification
        fields = ( 'id', 'created_at', 'msg_txt', 'url', 'absolute_url' )

models.py

from django.contrib.sites.models import Site

class Notification(models.Model):
    sender_user = models.ForeignKey(User, related_name = 'sender_user' )
    created_at = models.DateTimeField(default=timezone.now)
    reciever_user = models.ForeignKey(User, related_name = 'reciever_user')
    readed_at = models.DateTimeField( blank=True, null = True )
    msg_txt = models.CharField(max_length=255, blank=False)

    def get_absolute_url(self):
        return "/notification/%i/" % self.id

    def get_full_absolute_url(self):
        domain=Site.objects.get_current().domain

        return 'http://%s%s' % (domain, self.get_absolute_url()) 

Var 2,没有站点框架

如果您没有站点框架,则可以使用 ALLOWED_HOSTS 设置。

models.py

from myapp.settings import ALLOWED_HOSTS

class Notification(models.Model):
    ...

    def get_full_absolute_url(self):
        domain=ALLOWED_HOSTS[0]

        return 'http://%s%s' % (domain, self.get_absolute_url()) 

生产站点需要ALLOWED_HOSTS。

【讨论】:

port怎么处理?开发服务器在 8000 上运行(默认,但您可以在另一个服务器上运行它),因为生产运行可能默认(在 URL 中未提及)80 或 443。【参考方案3】:

这可能对你有用:

class Article(models.Model):
    ...
    ...
    def get_absolute_url(self):
        path = reverse('display_article', args=[self.slug])
        return "http://%s%s" % (self.site, path)

【讨论】:

仍然很糟糕,它不会为您自动检测协议。你会认为至少 RequestSite 对象会知道! 你是如何处理port 的?开发服务器在 8000 上运行(默认,但您可以设置另一个),因为生产运行可能默认为 80 或 443(在 URL 中未提及)。 self 现在没有site! Django 2.1【参考方案4】:

当我需要完整的 URL 时,我通常会选择 request.get_absolute_url(),而不是使用 Site.objects.get_current().domain 自己组装它。不过貌似有issues这个方法。

无论如何,我认为模型不是放置这个的正确位置,因为它通过在 urlconf 和模型中复制 URL 违反了 DRY 原则。你不能使用某种形式的reverse URL lookups吗?

【讨论】:

你能举一些关于如何使用request.get_absolute_url()的例子吗?目前我有一个上下文处理器将站点名称变量传递给模板并像这样组装绝对网址:object.title a> 我认为这不是输出绝对 url 的好方法 只需传递相对于您的根 URL 的 URL 确认,如“request.get_full_url(URL_to_my_view)”。我经常将它与反向查找一起使用,这也是我链接到它的原因。

以上是关于get_absolute_url 中的 django 完整 url的主要内容,如果未能解决你的问题,请参考以下文章

在 JSON 输出中包含 get_absolute_url 值

为啥 django page cms get_absolute_url 返回一个空字符串?

使用 get_absolute_url() 的 NoReverseMatch 错误

get_absolute_url:找不到“文章详细信息”的反向错误

在 Django auth 中设置 `get_absolute_url`

get_absolute_url无效