2010-10-22 5 views
9

Je veux avoir une url absolue/complète quand j'appelle ma méthode get_absolute_url de modèles dans le modèle. dans mon modèle d'entrée j'ai ci-dessous:django full url dans 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) 

dans mon fichier modèle:

{{object.get_absolute_url}} 

Je veux l'url sortie avec préfixé 'http://www.example.com'

Je veux utiliser les lignes ci-dessous pour obtenir le nom de domaine actuel, mais je ne sais pas où je vais le mettre.

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

Voici une bonne réponse à cette question, que vous pourriez adapter pour fournir une méthode à votre modèle (notez que vous devrez peut-être passer l'objet de requête au modèle comme contexte supplémentaire): http://stackoverflow.com/ questions/2345708/how-i-get-full-absolute-url-with-domain-in-django – ropable

Répondre

1

Quand j'ai besoin des URL complètes, je vais usally pour request.get_absolute_url(), plutôt que de le monter moi-même en utilisant Site.objects.get_current().domain. Cependant, il semble y avoir quelques issues avec cette méthode.

Dans tous les cas, je ne pense pas que le modèle soit le bon endroit pour mettre cela parce qu'il viole le principe DRY en dupliquant l'URL dans l'urlconf et dans le modèle. Ne pouvez-vous pas utiliser une forme de reverse URL lookups?

+0

pouvez-vous donner quelques exemples sur la façon d'utiliser request.get_absolute_url()? actuellement j'ai un processeur de contexte pour passer la variable de nom de site aux modèles et assembler l'URL absolue comme ceci: {{object.title}} qui je pense n'est pas un bon moyen de sortir l'URL absolue –

+1

Il suffit de passer l'URL par rapport à votre URL racine confirmer comme 'request.get_full_url (URL_to_my_view)'. J'utilise souvent cela avec la recherche inversée, qui est aussi pourquoi je lie à cela. –

4

Cela pourrait fonctionner pour vous:

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

Souhaite toujours qu'il ne détecte pas automatiquement le protocole pour vous. On pourrait penser qu'au moins l'objet RequestSite le saurait! –

2

Ma solution, avec cadre Sites

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

Dans 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, sans cadre Sites

Si vous n'êtes pas le cadre des sites, vous pouvez utiliser les paramètres de allowed_hosts.

Dans 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 est nécessaire pour le site de production.