2010-10-22 22 views
9

Quiero tener una url absoluta/completa cuando llamo a mis modelos método get_absolute_url en la plantilla. en mi modelo de entrada que tengo a continuación:url completa django en get_absolute_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) 

en mi archivo de plantilla:

{{object.get_absolute_url}} 

Quiero salida de la url precedidas por 'http://www.example.com'

Quiero utilizar las siguientes líneas para obtener el nombre de dominio actual, pero no sé dónde lo pondré.

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

Aquí hay una buena respuesta a esta pregunta, que puede adaptar para proporcionar un método en su modelo (tenga en cuenta que puede necesitar pasar el objeto de solicitud a la plantilla como contexto adicional): http://stackoverflow.com/ questions/2345708/how-can-i-get-the-full-absolute-url-with-domain-in-django – ropable

Respuesta

1

Cuando necesito una URL completa, lo suficientemente cerca para ir request.get_absolute_url(), en lugar de montarlo a mí mismo usando Site.objects.get_current().domain. Sin embargo, parece que hay algunos issues con este método.

En cualquier caso, no creo que el modelo sea el lugar adecuado para poner esto porque infringe el principio DRY al duplicar la URL en el urlconf y en el modelo. ¿No puedes usar alguna forma de reverse URL lookups?

+0

¿Pueden dar algunos ejemplos sobre cómo usar request.get_absolute_url()? Actualmente tengo un procesador de contexto para pasar la variable de nombre de sitio a plantillas y ensamblar la url absoluta como esta: {{object.title}} que creo que no es una buena forma de generar la URL absoluta –

+1

Simplemente pase la URL relativa a su URL raíz como confirmación 'request.get_full_url (URL_to_my_view)'. A menudo uso eso junto con la búsqueda inversa, que es también la razón por la que me enlace a eso. –

4

Esto podría funcionar para usted:

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

Todavía apesta que no detecta automáticamente el protocolo por usted. ¡Pensarías que al menos el objeto RequestSite lo sabría! –

2

Mi solución, con Sitios marco

En 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') 

En 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, sin Sitios marco

Si usted tiene no los sitios marco, puede utilizar la configuración allowed_hosts.

En 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 se requiere para la planta de producción.

Cuestiones relacionadas