Question

J'apprends actuellement à utiliser les vues basées sur les classes dans Django 1.3. J'essaie de mettre à jour une application pour les utiliser, mais je ne comprends toujours pas très bien comment ils fonctionnent (et j'ai lu la référence des vues basée sur les classes comme deux ou trois fois par jour).

À la question, j'ai une page d'index d'espace qui a besoin de données de contexte supplémentaires, le paramètre URL est un nom (pas de pk, et qui ne peut pas être modifié, c'est le comportement attendu) et les utilisateurs qui n'ont pas cet espace Sélectionné dans leurs profils ne peut pas y entrer.

Mon code basé sur la fonction (fonctionne 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))

Ma vue basée sur la classe (ne fonctionne pas, et aucune idée de la façon de continuer):

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'est-ce que je manque pour que le DetailView fonctionne?

Était-ce utile?

La solution

Le seul problème que je vois dans votre code est que le paramètre SLUG de votre URL est nommé 'space_name' à la place de 'slug'. Les vues slug_field L'attribut se réfère au champ modèle qui sera utilisé pour la recherche de limaces, pas le nom de capture d'URL. Dans l'URL, vous devez nommer le paramètre 'slug' (ou 'pk', quand il est utilisé à la place).

Aussi, si vous définissez un get_object Méthode, vous n'avez pas besoin des attributs queryset, model ou slug_field, sauf si vous les utilisez dans votre get_object ou ailleurs.

Dans le cas ci-dessus, vous pouvez soit utiliser votre get_object Comme vous l'avez écrit ou défini ce qui suit, seulement:

model = Space
slug_field = 'space_name'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top