2013-01-05 5 views
5

हैलो मैं अपने ऐप को फ़ंक्शन आधारित दृश्यों के बजाय कक्षा आधारित दृश्यों का उपयोग करने के लिए माइग्रेट कर रहा हूं। मेरे पुराने कोड में मैं एक समारोह दृश्य से संबंधित इस तरह से एक वस्तु का पूर्ण URL प्राप्त करने में सक्षम था:कक्षा आधारित दृश्यों का उपयोग करते समय Django में पूर्ण URL प्राप्त करें

class Category(models.Model): 
    name = models.CharField(max_length=100,unique=True) 
    slug = models.SlugField(unique=True) 
    description = models.TextField() 
    parent = models.ForeignKey('self',null=True,blank=True) 

    def get_absolute_url(self): 
     return reverse('blog.views.showcategory',args=[str(self.slug)]) 

मैं नहीं मिल सका है कि मैं क्या आदेश प्राप्त करने के लिए मेरी बात संपूर्ण url समारोह में बदलना चाहिए एक ही परिणाम।

यह मेरा नया वर्ग आधारित दृश्य

class CategoryView(ListPosts): 
    template_name = "postlist.html" 
    context_object_name="posts" 
    def get_queryset(self): 
     return Post.objects.filter(category__slug=self.kwargs['slug']).order_by('created') 

धन्यवाद है!

+1

आपके urlconf में उचित रेखा कैसा दिखती है? और Django आपको क्या फेंक देता है? –

उत्तर

19

आप हमेशा अपने यूआरएल एक नाम देना चाहिए, और उस का संदर्भ लें: reverse बुला के रूप में

@models.permalink 
def get_absolute_url(self): 
    return ('category_view',(), {'slug': self.slug}) 

नोट मैं स्थायी लिंक डेकोरेटर, जो एक ही करता है का उपयोग किया है:

url(r'/category/(?P<slug>\w+)/$', CategoryView.as_view(), name='category_view'), 

अब लेकिन थोड़ा नीरस है।

+7

1.6 दस्तावेज़ों के मुताबिक, परमालिंक सजावट की अब अनुशंसा नहीं की जाती है: https://docs.djangoproject.com/en/1.6/ref/models/instances/#the-permalink-decorator – highpost

+0

यह काम भी django 1.10 के साथ काम किया। – javed

6

यहाँ मेरी get_absolute_url विन्यास है:

urls.py

urlpatterns = patterns('', 
    url(r'^products/(?P<slug>[\w\d\-\_]+)/$', views.ProductView.as_view(), name='product'), 
    ) 

models.py

def get_absolute_url(self): 
    return reverse('products:product', kwargs={'slug':self.slug}) 

मेरे urls.py "उत्पाद" अनुप्रयोग किया जा रहा है, इसलिए यूआरएल नेमस्पेस "उत्पाद: उत्पाद"

है 210
+0

और यदि regexp को इस प्रकार नामित नहीं किया गया था: url (r '^ products/([\ w \ d \ - \ _] +)/$', views। उत्पाद View.as_view(), name = 'product') , ) आप पैरामीटर kwargs इंजेक्षन कैसे करेंगे? kwargs = self.slug काम नहीं करता है। – Reveclair

+0

@ रिवेक्लेयर 'kwargs' एक प्रमुख शब्द तर्क शब्दकोश है, इसलिए आप इसे' self.slug' के बराबर सेट नहीं करना चाहते हैं। आप किसी अन्य पायथन शब्दकोश की तरह पैरामीटर को 'kwargs' में इंजेक्ट कर सकते हैं। यानी 'kwargs [' foo '] =' bar''। इसके अलावा, Django के लिए, केवल नामित यूआरएल पैरामीटर 'kwargs' में इंजेक्शन दिए जाते हैं, इसलिए यूआरएल regex में उन्हें नाम देना महत्वपूर्ण है। –

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