2016-12-24 1 views
1

In dieser Django-App von mir verwende ich eine Klasse ListView, um von Benutzern hochgeladene Fotos aufzulisten. Man kann diese Fotos up- oder downvoten. Nicht authentifizierte Benutzer können die Fotos sehen, dürfen jedoch keine Stimmen abgeben.Verwenden von HttpResponseRedirect() in einer Django-Ansicht, in der der Kontext übergeben werden muss

Ein nicht zu ignorierender Abschnitt meiner Benutzer verwenden ältere Geräte, die JS nicht unterstützen können. Für solche Benutzer ist Upvote oder Downvote nicht AJAX-fähig. Stattdessen wird die gesamte Seite aktualisiert.

Ich stelle sicher, dass die Seitenaktualisierung immer noch solche Benutzer auf demselben Foto landet, das sie gewählt haben. Ich mache dies über das <a name="section{{ forloop_counter }}"> Tag in HTML.

Ich zeige 20 Fotos pro Seite, d. H. 20 Abschnitte. Nach der Abstimmung übergebe ich die photo_id an die Methode def get(self, request, *args, **kwargs) der ListView-Klasse. Ich berechne, welche section_num die photo_id erscheint in. Dann mache ich einfach return HttpResponseRedirect(section_num). Dies bringt mich an die richtige Position, z. http://example.com/?page=1#section8.

Meine Frage ist: anstelle der Verwendung einer ListView class, nehme an, ich schreibe meine eigene benutzerdefinierte Ansicht, um die Fotos und solche aufzulisten. Wie implementiere ich in diesem Fall die oben genannte Funktionalität HttpResponseRedirect(section_num)? Ein anschauliches Beispiel wäre großartig. Danke im Voraus!


Hier ist meine benutzerdefinierte Ansicht:

def photos_list(request, *args, **kwargs): 
     form = PhotosListForm() 
     ob_list = retrieve_latest_photos(request.user.id) 
     paginator = Paginator(ob_list, 20) 
     page = request.GET.get('page', '1') 
     try: 
      page = paginator.page(page) 
     except PageNotAnInteger: 
      page = paginator.page(1) 
     except EmptyPage: 
      page = paginator.page(paginator.num_pages) 
     context = {'object_list': ob_list, 'form':form, 'page':page,'username':request.user.username} 
     return render(request, 'photos_list.html', context) 

Hinweis: Ich lese this SO question, kann aber nicht erkennen, wie es in meinem Fall hilft. Ein Teil davon ist, weil ich ein Anfänger bin, sondern auch, weil der op scheint es ein anderes Problem ist

Antwort

0

Ihre Fragen zu haben, ist nicht klar - aber haben Sie betrachten <a name="section{{ object.id }}"> oder <div id="photo-{{ object.id }}"> mit und leiten zu den #photo.id statt berechnen?

+0

Udi, danke für den Tipp. Meine Frage ist dies: Ich muss ein 'Kontext' Wörterbuch an die Vorlage übergeben, also benutze ich 'render()' in meiner ** benutzerdefinierten Ansicht **. Was müsste ich tun, um auf ein bestimmtes Anchor-Tag innerhalb der Seite umzuleiten? Mit einer ListView-Klasse kann ich 'HttpResponseRedirect' in der Methode' get() 'verwenden. Was ist bei Verwendung einer benutzerdefinierten Ansicht? –

+0

Ja, Sie können es aus einer benutzerdefinierten Ansicht verwenden. – Udi

+0

Okay, verstanden. Im Grunde wird 'vote' eine benutzerdefinierte Weiterleitungsansicht aufrufen, die' HttpResponseRedirect' verwendet, um zum richtigen Anchor-Tag zu gelangen. Was den Tipp bezüglich der Verwendung von 'object.id' angeht - ich habe es nicht klar genug erklärt - muss ich auch die ** Seitennummer ** ableiten, da die Fotosliste paginiert ist. I.e. Berechne '? page = 1 # section8' und nicht nur' # section8'. Wie mache ich das, wenn ich deinen Tipp in der Antwort verwende? –

Verwandte Themen