2015-08-11 3 views
7

मैं Django क्लास आधारित विचारों के लिए नया हूँ। मैं एक पोस्ट के विवरण प्राप्त करने के लिए एक सरल दृश्य बनाने की कोशिश कर रहा हूं। मेरे views.py:Django में सामान्य विवरण दृश्य में पीके या स्लग पास करना?

from django.views.generic import ListView, View, DetailView 
class GenreDetail(DetailView): 
      model = Post 
      template_name = "post.html" 

मेरे urls.py:

urlpatterns = [ 
     url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'), 
     url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()), 
    ] 

त्रुटि है कि मैं मिलता है:

AttributeError at /2/memoirs-of-a-geisha-by-arthur-golden 
Generic detail view GenreDetail must be called with either an object pk or a slug. 

तो पी या स्लग जेनेरिक Detailview तक नहीं पहुंचेगी। मैं इसे कैसे पास करूं? मैं यूआरएल से मानता हूं कि यह उठा सकता है लेकिन यह नहीं है।

उत्तर

6

url प्रतिमानों क्रम में जाँच कर रहे हैं आप उन्हें

इसलिए यहाँ परिभाषित:

urlpatterns = [ 
     url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'), 
     url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()), 
    ] 

... पहले पैटर्न मिलान किया जा रहा है (क्योंकि यह साथ $ तो अतिरिक्त खंड है अंत नहीं है सिर्फ ध्यान नहीं दिया)

... और उस पैटर्न केवल आर्ग

केवल एक कीवर्ड गुजरता है आम तौर पर यह एक बुरा विचार multipl है ई यूआरएल पैटर्न एक ही दृश्य को इंगित करते हैं। यदि संभव हो तो आपको एक सिंगल रेगेक्स (उदाहरण के लिए optional groups का उपयोग करना) का प्रयास करना चाहिए और जो किसी विशेष दृश्य के लिए यूआरएल के विभिन्न मामलों को संभालता है। यह उस तरह से अधिक स्पष्ट है।

दूसरी ओर, बस पहले अधिक स्पष्ट एक डाल करने के लिए भी काम करते हैं और सही होगा अपने पैटर्न के आदेश पीछे (इस urlpatterns की Django नियम है!)

urlpatterns = [ 
     url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()), 
     url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'), 
    ] 

रूप @ozgur का उल्लेख है तुम भी आप DetailView बताने के लिए है कि यह डिफ़ॉल्ट लोगों के बजाय URL में post_id कीवर्ड का उपयोग करना चाहिए है कि है pk_url_kwarg

2
समस्या

की स्थापना करके pk के बजाय post_id उपयोग करने के लिए दृश्य बताने की आवश्यकता pk याऑब्जेक्ट प्राप्त करने के लिएप्रदर्शित किया जाएगा।

यह pk_url_kwarg विशेषता सेटिंग करके किया जा सकता:

(आपका यूआरएल परिभाषा भी गलत है, हमेशा $ के साथ अपने यूआरएल परिभाषाओं खत्म।

  • /2
  • /2/संस्मरण-के-एक-गीषा-दर-आर्थर: नीचे सही संस्करण)

    url(r'(?P<post_id>\d+)$', GenreDetail.as_view(), name = 'post'), 
    url(r'(?P<post_id>\d+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()), 
    

    निम्नलिखित यूआरएल url प्रतिमानों ऊपर दिए गए मैच होगा -golden


from django.views.generic import DetailView 

class GenreDetail(DetailView): 
    model = Post 
    template_name = "post.html" 
    pk_url_kwarg = "post_id" 

वैकल्पिक रूप से, तुम सिर्फ post_idpk करने के लिए अपने URL में बदल सकते हैं, ताकि आप अपने ध्यान में रखते हुए कुछ भी स्पर्श की जरूरत नहीं है:

url(r'(?P<pk>\d+)$', GenreDetail.as_view(), name = 'post'), 
url(r'(?P<pk>\d+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()), 
+1

क्वेरी पैरामीटर का नाम यूआरएल में 'पीके'' में बदलना भी काम करता है। धन्यवाद। – Coderaemon

5

आप तो अपने यूआरएल की तरह होना चाहिए या तो post_id या स्लग का उपयोग कर विवरण लाने के लिए चाहते हैं इस

url(r'post/(?P<post_id>\d+)/$', GenreDetail.as_view(), name = 'post_detail'), 
url(r'post/(?P<slug>[-\w]+)/$', GenreDetail.as_view(), name = 'post_detail_slug'), 

और आपके विचार किया जाना चाहिए इस

from django.views.generic import DetailView 

class GenreDetail(DetailView): 
    model = Post 
    template_name = "post.html" 
    pk_url_kwarg = "post_id" 
    slug_url_kwarg = 'slug' 
    query_pk_and_slug = True 

अधिक जानकारी के लिए की तरह docs कृपया पढ़ें ।

+2

कृपया ध्यान दें कि 'query_pk_and_slug' को Django 1.8 – ozgur

+0

@ozgur में पेश किया गया था, यह इंगित करने के लिए धन्यवाद! –

+0

pk_url_kwarg = "post_id" slug_url_kwarg = 'slug' query_pk_and_slug = True – soField

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