2010-10-22 49 views
9

Tôi muốn có url tuyệt đối/hoàn chỉnh khi tôi gọi phương thức get_absolute_url của mình trong mẫu. trong mô hình nhập của tôi có dưới đây:django url đầy đủ trong 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) 

trong mẫu của tôi file:

{{object.get_absolute_url}} 

Tôi muốn đầu ra các url prepended với 'http://www.example.com'

Tôi muốn sử dụng các dòng dưới đây để có được tên miền hiện tại nhưng tôi không biết nơi tôi sẽ đặt nó.

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

Có một câu trả lời hay cho câu hỏi này ở đây, mà bạn có thể thích ứng để cung cấp một phương thức trên mô hình của bạn (lưu ý rằng bạn có thể cần chuyển đối tượng yêu cầu tới mẫu dưới dạng ngữ cảnh bổ sung): http://stackoverflow.com/ câu hỏi/2345708/how-can-i-get-the-đầy đủ-tuyệt đối-url-với-miền-in-django – ropable

Trả lời

1

Khi tôi cần URL đầy đủ, tôi usally đi cho request.get_absolute_url(), chứ không phải là lắp ráp nó bản thân mình sử dụng Site.objects.get_current().domain. Tuy nhiên, có vẻ như có một số issues với phương pháp này.

Trong mọi trường hợp, tôi không nghĩ rằng mô hình là đúng nơi để đặt điều này bởi vì nó vi phạm nguyên tắc DRY bằng cách sao chép URL trong urlconf và trong mô hình. Bạn không thể sử dụng một số hình thức reverse URL lookups?

+0

bạn có thể cho một số ví dụ về cách sử dụng request.get_absolute_url() không? hiện tại tôi có bộ xử lý ngữ cảnh để chuyển biến tên trang thành mẫu và lắp ráp url tuyệt đối như sau: {{object.title}} mà tôi nghĩ không phải là cách tốt để xuất url tuyệt đối –

+1

Chỉ cần chuyển URL tương ứng với URL gốc của bạn xác nhận 'request.get_full_url (URL_to_my_view)'. Tôi thường sử dụng nó cùng với tra cứu ngược lại, đó cũng là lý do tại sao tôi liên kết đến điều đó. –

4

Điều này có thể làm việc cho bạn:

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

Vẫn hút rằng nó không tự động phát hiện giao thức cho bạn. Bạn sẽ nghĩ rằng ít nhất đối tượng RequestSite sẽ biết điều đó! –

2

Giải pháp của tôi, với Sites khuôn khổ

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

Trong 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, không có khung Sites

Nếu bạn có khuôn khổ không Sites, bạn có thể sử dụng các thiết lập ALLOWED_HOSTS.

Trong 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 là cần thiết cho địa điểm sản xuất.

Các vấn đề liên quan