当我在模板中调用模型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
答案 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())
生产网站需要
答案 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的最佳方法,但是我没有找到更好的方法来获得所需的结果。我希望这对某人有帮助。