5

मैं वर्तमान में सीख रहा हूं कि django 1.3 में वर्ग-आधारित विचारों का उपयोग कैसे करें। मैं उनका उपयोग करने के लिए एक एप्लिकेशन को अपडेट करने की कोशिश कर रहा हूं, लेकिन मैं अभी भी बहुत अच्छी तरह से समझ नहीं पा रहा हूं कि वे कैसे काम करते हैं (और मैंने पूरे वर्ग-आधारित विचार संदर्भ को दो या तीन बार हर दिन पढ़ा है)।django 1.3 में एक विस्तार दृश्य कैसे करें?

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

मेरे समारोह आधारित कोड (कार्य ठीक):

def view_space_index(request, space_name): 

    place = get_object_or_404(Space, url=space_name) 

    extra_context = { 
     'entities': Entity.objects.filter(space=place.id), 
     'documents': Document.objects.filter(space=place.id), 
     'proposals': Proposal.objects.filter(space=place.id).order_by('-pub_date'), 
     'publication': Post.objects.filter(post_space=place.id).order_by('-post_pubdate'), 
    } 

    for i in request.user.profile.spaces.all(): 
     if i.url == space_name: 
      return object_detail(request, 
           queryset = Space.objects.all(), 
           object_id = place.id, 
           template_name = 'spaces/space_index.html', 
           template_object_name = 'get_place', 
           extra_context = extra_context, 
           ) 

    return render_to_response('not_allowed.html', {'get_place': place}, 
           context_instance=RequestContext(request)) 

मेरे वर्ग आधारित दृश्य (काम नहीं कर रहा है, और पता नहीं जारी रखने के लिए कैसे):

class ViewSpaceIndex(DetailView): 

    # Gets all the objects in a model 
    queryset = Space.objects.all() 

    # Get the url parameter intead of matching the PK 
    slug_field = 'space_name' 

    # Defines the context name in the template 
    context_object_name = 'get_place' 

    # Template to render 
    template_name = 'spaces/space_index.html' 

    def get_object(self): 
     return get_object_or_404(Space, url=slug_field) 

    # Get extra context data 
    def get_context_data(self, **kwargs): 
     context = super(ViewSpaceIndex, self).get_context_data(**kwargs) 
     place = self.get_object() 
     context['entities'] = Entity.objects.filter(space=place.id) 
     context['documents'] = Document.objects.filter(space=place.id) 
     context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date') 
     context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate') 
     return context 

urls.py

from e_cidadania.apps.spaces.views import GoToSpace, ViewSpaceIndex 
urlpatterns = patterns('', 
    (r'^(?P<space_name>\w+)/', ViewSpaceIndex.as_view()), 
) 

मुझे विस्तार से देखने के लिए क्या याद आ रही है?

उत्तर

10

आपके कोड में केवल एक ही समस्या यह है कि आपके यूआरएल के स्लग पैरामीटर को के बजाय 'space_name' नाम दिया गया है। दृश्य की slug_field विशेषता मॉडल फ़ील्ड को संदर्भित करती है जिसका उपयोग स्लॉग लुकअप के लिए किया जाएगा, यूआरएल कैप्चर नाम नहीं। यूआरएल में, आपको पैरामीटर 'slug' (या 'pk', इसके बजाय इसका उपयोग होने पर) नाम देना होगा।

इसके अलावा, आप एक get_object विधि को परिभाषित कर रहे हैं, आप विशेषताओं queryset, model या slug_field, की जरूरत नहीं है जब तक कि आप उन्हें अपने get_object या कहीं और में प्रयोग करते हैं।

ऊपर मामले में, आप या तो इस्तेमाल कर सकते हैं अपने get_object आप ने लिखा या निम्नलिखित को परिभाषित के रूप में, केवल:

model = Space 
slug_field = 'space_name' 
+0

धन्यवाद! मैं तुरंत कोड का परीक्षण करूंगा –

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