Django DetailView – Come modificare il get_object per il controllo di un campo

Quindi voglio fare un DetailView che mostra una foto di se stessa, e le relative informazioni. Tuttavia, voglio fare è assicurarsi che l’utente ha il permesso di accedere a una foto.

Questo è il urls.py per la vista

url(r'^photo/(?P<slug>[\-\d\w]+)/$', views.PhotoDetail.as_view(), name='photo'),

Questo è il views.py

class PhotoDetail(DetailView):
    template_name = 'otologue/photo_detail.html'

    def get_object(self, queryset=None):
        slug = self.get_slug_field()
        print(slug)
        object_instance = Photo.objects.filter(slug=slug)
        print(object_instance)
        object_user = object_instance.photoextended.user
        user = get_object_or_404(User, username=self.request.user)  # Get the user in the view

        if object_user != user:  # See if the object_user is the same as the user
            return HttpResponseForbidden('Permission Error')

        else:
            return object_instance

Come si può vedere, cerco di get_slug_field() ma quando mi stampa solo dice ‘slug’ quando la lumaca si dovrebbe dire che gli oggetti slug che è nell’url.
Da questo il object_instance non avere nessun oggetto e poi perché cerco di ottenere l’utente da esso, non può trovare tutti i dati.

  • Nota che filter() restituisce un queryset di foto. Se si desidera una singola foto che si desidera Photo.objects.get(slug=slug) (anche se questo può aumentare get_object_or_404.

 

One Reply
  1. 18

    Il DetailView‘s get_object metodo già sa come recuperare un oggetto da lumaca. Non c’è bisogno di duplicare il codice, basta chiamare super().

    È possibile confrontare l’utente self.request.user direttamente – non c’è bisogno di recuperare nuovamente l’utente dal database con get_object_or_404.

    Infine, non si può ritornare a una risposta da get_object, il metodo è lo scopo di restituire l’oggetto. Tuttavia, è possibile sollevare un’eccezione, come Http404.

    from django.http import Http404
    
    class PhotoDetail(DetailView):
    
        def get_object(self, queryset=None):
            obj = super(PhotoDetail, self).get_object(queryset=queryset)
            if obj.user != obj.photoextended.user:
                raise Http404()
            return obj

    Un approccio comune in classe a base di vista è quello di ignorare get_queryset e il filtro per utente. Il get_object metodo di utilizzo di questo queryset quando recuperare l’oggetto. Se l’oggetto non è in queryset, l’utente otterrà un errore 404.

    class PhotoDetail(DetailView):
    
        def get_queryset(self):
            queryset = super(PhotoDetail, self).get_queryset()
            return queryset.filter(photoextended__user=self.request.user)
    • Grazie per la grande risposta sembra funzionare perfettamente. Cambiarlo è voluto un queryset ‘classe PhotoDetail(DetailView): template_name = ‘otologue/photo_detail.html’ queryset = Foto.oggetti def get_queryset(self): queryset = super(PhotoDetail, self).get_queryset() return queryset.filtro(photoextended__utente=self.richiesta.utente)’
    • Sembra proprio di confusione su come si riesce a ottenere la corretta Foto dell’oggetto. Il queryset cerca automaticamente la lumaca nei risultati della query e confrontarlo con il slugfield nell’url
    • get_object metodo inizia con la queryset da get_queryset, e i filtri usando la lumaca la URL per ottenere l’oggetto. Si potrebbe trovare ccbv utile per esplorare come i metodi in classe visualizzazioni di stare insieme.

Lascia un commento