2012-11-21 10 views

उत्तर

31

@permalink, एक अजगर decorator है, जबकि get_absolute_url एक Django मॉडल पर एक विधि है।

दोनों एक विशेष वस्तु के लिए यूआरएल को उलट करने की अनुमति देने के साथ चिंतित हैं और इन्हें एक साथ इस्तेमाल किया जाना चाहिए। जब भी आपको किसी विशेष ऑब्जेक्ट का लिंक प्रदान करने की आवश्यकता होती है या उस ऑब्जेक्ट के विशिष्ट यूआरएल (यदि उसके पास एक है) को उपयोगकर्ता को

प्रदर्शित करना चाहते हैं तो आप हार्ड कोडित स्ट्रिंग को वापस करने के लिए बस अपनी get_absolute_url विधि लिख सकते हैं, लेकिन यह डीजेई के डीजेंगो के दर्शन का पालन नहीं करेगा (खुद को दोहराएं)। इसके बजाय, चीजों को और अधिक लचीला बनाने के लिए @permalink है।

यदि आप the docs on the subject पढ़ते हैं तो आप देखेंगे कि वे एक-दूसरे से कैसे संबंधित हैं। @permalink सजावटी डजेगो के यूआरएल कॉन्फ़्रेंस के बैकएंड में हुक करता है, जिससे आप named url patterns का उपयोग कर अधिक पोर्टेबल कोड लिख सकते हैं। यह केवल get_absolute_url का उपयोग करने के लिए बेहतर है: आपका कोड बहुत अधिक DRYer हो जाता है क्योंकि आपको पथ निर्दिष्ट करने की आवश्यकता नहीं है।

class BlogPost(models.Model): 
    name = modelsCharField() 
    slug = models.SlugField(...) 

    @permalink 
    def get_absolute_url(self): 
     return ("blog-detail", [self.slug,]) 

और urls.py

... 
    url(r'/blog/(?P<slug>[-w]+)/$', blog.views.blog_detail, name="blog-detail") 
65

2013 की स्थिति के अनुसार में, Django प्रलेखन स्थायी लिंक डेकोरेटर के प्रयोग को प्रोत्साहित और get_absolute_url विधि के शरीर में() रिवर्स के उपयोग के लिए प्रोत्साहित किया। लेकिन 2015 तक, परमालिंक सजावट में डैंजो दस्तावेज से ट्रेस किए बिना गायब हो गया है, इसलिए हम सुरक्षित रूप से यह मान सकते हैं कि इसे हटा दिया गया है।

तो, एक मानक सूखी तरह, एक वस्तु को देखने के लिए एक स्थायी कड़ी बनाने के इस तरह अपने मॉडल में get_absolute_url() का उपयोग करने के लिए: urls.py कि अंक में एक प्रविष्टि

from django.db import models 
from django.urls import reverse 
# NOTE: pre Django 1.10+ this is "from django.core.urlresolvers import reverse" 


class MyModel(models.Model): 
    slug = models.SlugField() 

    def get_absolute_url(self): 
     return reverse('mymodel_detail', args=(self.slug,)) 

और उसके बाद है आपके विचार में:

url(r'^(?P<slug>[-\w\d\_]+)/$', 
    MyModelDetailView.as_view(), 
    name='mymodel_detail'), 
+1

Django 2.0 में, 'रिवर्स' को 'django.urls' से आयात किया जाना चाहिए, या आपको' मॉड्यूल नॉटफाउंड एरर 'मिलेगा। – cjohnson318

+0

धन्यवाद - मैं अपडेट करूंगा –

संबंधित मुद्दे