Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django完整url在get_absolute_url中_Django - Fatal编程技术网

django完整url在get_absolute_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

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

当我需要完整的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
,然后在models
get\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。