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?
Gracias! Voy a probar el código de inmediato –