Erreur de pagination Django
-
28-10-2019 - |
Question
J'ai créé une application Django.Il existe une fonctionnalité de filtrage dans mon application.Les données filtrées sont affichées sur une page distincte.
Maintenant, je veux donner Django Pagination à la page de liste filtrée.En le faisant, je suis tombé sur cette erreur.La pagination est affichée en bas de la page avec le nombre correct de pages SUIVANT.
Mais en cliquant sur «Page suivante» dans le paginateur, il me redirige vers ma page d'accueil (/ employeeList).
Je suppose que c'est à cause d'un HttpResponseRedirect (return HttpResponseRedirect('/employeeList'))
que je donne à l'intérieur du filter()
qui est utilisé dans certains cas.Je vais coller mon filtre () et le HTML pour la pagination.
def filter(request):
val2=''
val3=''
newData=''
if request.GET.has_key('choices'):
val2=request.GET.get('choices')
if request.GET.has_key('textField'):
val3=request.GET.get('textField')
if request.POST:
val2=request.POST.get('choices')
val3=request.POST.get('textField')
if val2=='Designation':
newData = EmployeeDetails.objects.filter(designation=val3)
flag=True
elif val2=='Name':
newData = EmployeeDetails.objects.filter(userName__icontains=val3)
flag=True
elif val2=='EmployeeID':
newData = EmployeeDetails.objects.filter(employeeID=val3)
flag=True
elif val2=='Project':
newData = EmployeeDetails.objects.filter(project=val3)
flag=True
elif val2=='DateOfJoin':
newData = EmployeeDetails.objects.filter(dateOfJoin=val3)
flag=True
else:
return HttpResponseRedirect('/employeeList')
if request.POST.get('sortAscendValue'):
newData = newData.order_by('userName')
elif request.POST.get('sortDescendValue'):
newData = newData.order_by('-userName')
paginator = Paginator(newData, 10)
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
try:
contacts = paginator.page(page)
except (EmptyPage, InvalidPage):
contacts = paginator.page(0)
return render_to_response('filter.html',{'newData':newData,'emp_list': contacts,'val2':val2,'val3':val3,'flag':flag,'emp_list': contacts})
<❯filter.html
<div class="pagination" >
<span class="step-links">
{% if emp_list.has_previous %}
<a href="?page={{ empl_list.previous_page_numbe }}">Previous</a>
{% endif %}
<span class="current">
Page {{ emp_list.number }} of {{ emp_list.paginator.num_pages }}.
</span>
{% if emp_list.has_next %}
<a href="?page={{ emp_list.next_page_number }}">Next</a>
{% endif %}
</span>
</div>
La solution
essayez
{% if emp_list.has_next %}
<a href="?page={{ emp_list.next_page_number }}&choices={{ val2 }}>Next</a>
{% endif %}
Autres conseils
Il semble que vous ayez déjà correctement identifié la raison pour laquelle le lien suivant redirige vers la page d'accueil:
- Le lien suivant sera quelque chose comme
?page=2
- Il n'y a pas de variable
choices
GET et il n'y a pas de variables POST, doncval2
sera''
quand il entrera votre longue instructionif
elif
. -
else: return HttpResponseRedirect('/employeeList')
sera exécuté, redirigeant l'utilisateur vers votre page d'accueil.
Je ne comprends pas quand ni comment vous voudriez que votre code de filtre soit redirigé vers la page d'accueil, mais il semble qu'il y ait deux options:
-
Supprimez le
else: return HttpResponseRedirect('/employeeList')
et utilisez des conditions différentes lorsque vous souhaitez rediriger l'utilisateur. -
Trouvez un moyen d'empêcher cette condition
else
de correspondre au lien suivant.
Pour la deuxième option, vous pouvez ajouter ce qui suit au-dessus de votre else
:
elif request.GET.get('page', False):
pass
Ce n'est certainement pas une jolie solution, mais cela semble être l'option la plus rapide (et la plus sale) sans refactoriser votre code.