get_absolute_url中的django full url

时间:2010-10-22 05:10:24

标签: django

当我在模板中调用模型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

4 个答案:

答案 0 :(得分:4)

这可能对您有用:

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

答案 1 :(得分:2)

我的解决方案, Sites framework

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,没有网站框架

如果您没有Sites框架,则可以使用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

答案 2 :(得分:1)

当我需要完整的网址时,我会使用request.get_absolute_url(),而不是使用Site.objects.get_current().domain自行汇编。但是,这种方法似乎有一些issues

在任何情况下,我认为该模型不适合放置它,因为它通过复制urlconf和模型中的URL而违反了DRY原则。你能不能使用某种形式的reverse URL lookups

答案 3 :(得分:0)

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

在settings.py中,我先设置BASE_URL,然后在模型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的最佳方法,但是我没有找到更好的方法来获得所需的结果。我希望这对某人有帮助。