5

Actualmente estoy aprendiendo a usar las vistas basadas en clases en django 1.3. Intento actualizar una aplicación para usarla, pero todavía no entiendo muy bien cómo funcionan (y leo toda la referencia de vistas basada en clases como dos o tres veces CADA día).¿Cómo hacer un DetailView en django 1.3?

A la pregunta, tengo una página de índice de espacio que necesita algunos datos contextuales adicionales, el parámetro url es un nombre (no pk, y eso no se puede cambiar, es el comportamiento esperado) y los usuarios que no lo hacen t que el espacio seleccionado en sus perfiles no pueda ingresarlo.

Mi código basado en las funciones (que trabaja muy bien):

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

Mi punto de vista basado en clases (no funciona, y no tenía idea de cómo continuar):

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

¿Qué me falta para que DetailView funcione?

Respuesta

10

El único problema que veo en su código es que el parámetro de la barra de URL se llama 'space_name' en lugar de 'slug'. El atributo slug_field de la vista se refiere al campo de modelo que se usará para la búsqueda de barras, no el nombre de la captura de url. En la url, debe nombrar el parámetro 'slug' (o 'pk', cuando se usa en su lugar).

Además, si estás definiendo un método get_object, usted no necesita los atributos queryset, model o slug_field, si no los usa en su get_object o en otro lugar.

En el caso anterior, se puede usar ya sea su get_object como se escribió o se defina lo siguiente, únicamente:

model = Space 
slug_field = 'space_name' 
+0

Gracias! Voy a probar el código de inmediato –

Cuestiones relacionadas