5

Şu anda django 1.3'te sınıf tabanlı görünümleri kullanmayı öğreniyorum. Onları kullanmak için bir uygulamayı güncellemeye çalışıyorum, ancak hala nasıl çalıştıklarını çok iyi anlayamıyorum (ve her gün iki veya üç kez gibi tüm sınıf-temelli görünümleri okudum).django 1.3 içinde DetailView nasıl yapılır?

Soru için, fazladan bağlam verisi gerektiren bir alan dizin sayfam var, url parametresi bir addır (pk değil, değiştirilemez, beklenen davranış) ve kullanıcılar Profillerinde seçilen alanın girememesi.

Benim fonksiyon tabanlı kodu (çalışma ince):

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

Benim sınıf tabanlı görünümü (çalışmıyor ve devam etmek için nasıl hiçbir fikri):

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()), 
) 

DetailView'ın çalışması için neyi kaçırıyorum?

cevap

10

Kodunuzda gördüğüm tek sorun, URL'nizin slug parametresinin 'slug' yerine 'space_name' olmasıdır. Görünümün slug_field özniteliği, URL yakalama adı değil sümük araması için kullanılacak model alanını belirtir. URL'de, 'slug' (veya yerine kullanıldığında 'pk') parametresini adlandırmanız gerekir. Bir get_object yöntemini tanımlayan eğer başka bir yerde senin get_object veya bunları kullanmadıkça

Ayrıca, sen özelliklerini queryset, model ya slug_field gerekmez. Yukarıdaki durumda

, sen senin get_object yazdığın veya aşağıdaki tanımlamak olarak kullanabilir ya sadece:

model = Space 
slug_field = 'space_name' 
+0

teşekkürler! Kodu hemen test edeceğim –