django完整url在get_absolute_url中
在模板中调用我的模型get_absolute_url方法时,我希望有一个绝对/完整的url。在我的入门模型中,我有以下内容:django完整url在get_absolute_url中,django,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").l
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
当我需要完整的url时,我通常使用
请求。获取绝对url()
,而不是自己使用Site.objects.get\u current().domain
组装它。然而,这种方法似乎有一些缺点
在任何情况下,我认为模型都不适合这样做,因为它通过复制urlconf和模型中的URL违反了DRY原则。您不能使用某种形式的?这可能适合您:
class Article(models.Model):
...
...
def get_absolute_url(self):
path = reverse('display_article', args=[self.slug])
return "http://%s%s" % (self.site, path)
我的解决方案,带有站点框架
在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' )
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())
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())
在模型中.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' )
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())
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())
Var 2,无站点框架
如果没有站点框架,则可以使用允许的\u主机设置
在模型中.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' )
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())
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())
是生产现场所必需的。由于我没有找到任何关于这方面的最新答案,我通过以下方式获得了结果: 在settings.py中,我设置
BASE\u URL
,然后在modelsget\u absolute\u URL
方法中:
def get_absolute_url(self):
从django.url反向导入
从django.conf导入设置
path=reverse('urlname',args=(arg))#假设在urls.py中设置了名为'urlname'的URL
返回“{}{}”。格式(settings.BASE_URL,path)
我不知道这是否是获得完整URL的最佳方式,但我没有找到更好的方式来达到预期的效果。我希望这能帮助一些人。你能举一些关于如何使用request.get_absolute_url()的例子吗?目前,我有一个上下文处理器将site name变量传递给模板,并按如下方式组装绝对url:我认为这不是输出绝对url的好方法,只需传递相对于根url的url,如“request.get_full_url(url_to_my_view)”确认即可。我经常将其与反向查找一起使用,这也是我链接到反向查找的原因。对于这个问题,这里有一个很好的答案,您可以在您的模型上提供一个方法(请注意,您可能需要将请求对象作为额外上下文传递给模板):仍然很糟糕,它无法自动检测协议。您可能认为至少RequestSite对象会知道这一点!您如何处理
端口
?开发服务器在8000上运行(默认,但您可以设置另一个),因为生产运行的可能是默认的80或443(URL中未提及)。self
现在没有site
!Django 2.1如何处理端口
?开发服务器在8000上运行(默认,但您可以在另一台上运行),因为生产运行可能是默认的(URL中未提及)80或443。