Mehrfach-Paginierung (Ajax) funktioniert nicht für Django-el-Paginierung

Lesezeit: 4 Minuten

Benutzer-Avatar
Zorgan

Ich habe 2 Abfragesätze: Post und Kommentar. Ich benutze Django-el-Paginierung um diese mit ajax zu rendern.

Hier ist meine Ansicht:

def profile(request, user, extra_context=None):

    profile = Profile.objects.get(user__username=user)

    page_template="profile.html"

    if request.is_ajax():
        user_queryset = request.GET.get('user_queryset')
        print('Queryset:', user_queryset)
        if user_queryset == 'user_posts':
            page_template="user_posts.html"
        elif user_queryset == 'user_comments':
            page_template="user_comments.html"
        else:
            pass

    print('Template:', page_template)

    user_posts = Post.objects.filter(user=profile.user).order_by('-date')
    user_comments = Comment.objects.filter(user=profile.user).order_by('-timestamp')

    context = {'user_posts': user_posts,'user_comments': user_comments, 'page_template': page_template}

    if extra_context is not None:
        context.update(extra_context)

    return render(request, page_template, context)

Ich habe einen Ajax-Aufruf, der herausfindet, welcher Abfragesatz verwendet wird. Wenn also auf „Mehr Kommentare“ oder „Mehr Posts“ (in der Vorlage) geklickt wird, um mehr paginierte Objekte zu erhalten, weiß ich, aus welchem ​​Abfragesatz es stammt. Wenn ich jedoch den obigen Code verwende und für die Ajax-Paginierung auf „Mehr“ klicke, wird die gesamte Seite angehängt, nicht die relevante untergeordnete Vorlage (user_posts.html oder user_comments.html). Aber die if request.is_ajax() Codeblock funktioniert gut; Es druckt die richtige zu verwendende Vorlage, sodass dies nicht passieren sollte.

Wenn ich diesen Codeblock in diesen ändere

if request.is_ajax():
    page_template="user_posts.html"

Die Ajax-Paginierung für Post funktioniert. Ich möchte jedoch Ajax-Paginierung für hinzufügen Comment auch. Warum nicht meine Initiale if request.is_ajax() funktioniert und wie kann ich das beheben?

BEARBEITEN:

Ausgabe, wenn ich auf klicke more posts:

Queryset: None
Template: profile.html
Queryset: user_posts
Template: user_posts.html

js

$('body').on('click', '.endless_more', function() {
    console.log($(this).html()); #works successfully 
    var user_queryset;
    if ($(this).html() === 'more posts') {
        console.log('POSTS'); #works successfully 
        var user_queryset="user_posts"
    } else if ($(this).html() === 'more user comments') {
        user_queryset="user_comments";
        console.log('COMMENTS'); #works successfully 
    } else {
        console.log('none');
    }
    $.ajax({
        type: 'GET',
        url: window.location.href,
        data: {
            'user_queryset': user_queryset
        }

    })
});

profil.html

<!--posts-->
<div class="user_posts_div">
    <div class="endless_page_template">
        {% include "user_posts.html" %}
    </div>
</div>

<!--comments-->
<div class="user_comments_div">
    <div class="endless_page_template">
        {% include "user_comments.html" %}
    </div>
</div>

user_posts.html (untergeordnete Vorlage)

{% paginate 5 user_posts %}
    {% for post in user_posts %}
        <div class="user_post">
            <p class="user_post_title_p"><a class="user_post_title" href="https://stackoverflow.com/questions/44731075/{% url"article' category=post.entered_category id=post.id %}">{{ post.title }}</a></p>
            <p class="user_post_category">/{{ post.entered_category }}</p>
            <p class="user_post_date">{{ post.date|timesince }}</p>
        </div>

    {% endfor %}
{% show_more 'more posts' '...' %}

Was ist die Ausgabe der unteren Zeile?

print('Queryset:', user_queryset)

Ich denke, Sie haben ein Problem in der folgenden Zeile

user_queryset = request.GET.get('user_queryset')

Dies gibt nicht den korrekten Get-Parameterwert für die Übereinstimmung mit der Bedingung des Beitrags- und Kommentarteils zurück.

  • Ja du hast recht, das ist es auf jeden Fall. Aus irgendeinem Grund wird es zweimal gedruckt, beim ersten Drucken der übergeordneten Vorlage (profile.html) was falsch ist; es sollte nur die untergeordnete Vorlage drucken (user_posts.html) Irgendeine Idee, warum es das tun würde? Ich habe die Ausgabe in meiner Bearbeitung hinzugefügt.

    – Zorgan

    24. Juli 2017 um 9:27 Uhr


  • zweimaliges Aufrufen bedeutet, dass Sie in js etwas falsch machen, um diese Ansicht aufzurufen. Sie haben page_template =’profile.html’ vor der Methode is_ajax() definiert. Wenn Sie also None in user_queryset haben, wird die profile.html-Vorlage gedruckt

    – Neeraj Kumar

    24. Juli 2017 um 9:32 Uhr

  • Ich habe meinen js-Code in der Bearbeitung hinzugefügt. Daran scheint nichts auszusetzen; Es protokolliert das richtige Wort, je nachdem, worauf geklickt wird. Irgendeine Idee?

    – Zorgan

    24. Juli 2017 um 9:48 Uhr


  • Haben Sie den El-Paginierungscode in die Vorlage eingefügt. Ich denke, el Paginierung und Ihre js rufen jeweils dieselbe Ansicht auf. Wenn el pagination Ihre Ansicht aufruft, erhalten Sie None in der Ausgabe, und wenn Sie js aufrufen, erhalten Sie eine andere Ausgabe, weil Sie js senden. Ich habs?

    – Neeraj Kumar

    24. Juli 2017 um 9:57 Uhr

  • Ich habe meine Vorlagen in Bearbeiten hinzugefügt, könnten Sie einen Blick darauf werfen?. Und ja, ich verstehe irgendwie, was du sagst, aber wie sonst würde ich mehr als 1 Abfragesatz (Post, Kommentar usw.) zulassen, ohne js zu verwenden? Ich habe versucht, dies zu replizieren, aber ich glaube, ich habe meine Ansichten falsch gemacht: django-el-pagination.readthedocs.io/en/latest/…

    – Zorgan

    24. Juli 2017 um 10:13 Uhr


Könnten Sie Ihr Javascript in der Nähe von:

   user_queryset="user_comments";

Versuchen Sie es zu ändern in:

   var user_queryset="user_comments";

Ich nehme an, wenn Sie direkt zu Kommentaren gehen, dass die Variable user_queryset undefiniert ist und nicht als ‘user_comments’ übergeben wird.

  • Ja das habe ich probiert und es bringt nichts. Ich habe gerade mein JS bearbeitet, das zeigt, dass ich die deklariere user_queryset Variable vorher, also ist es nicht undefiniert. Das JS sendet die richtigen Daten, das Problem scheint in den Ansichten zu liegen.

    – Zorgan

    8. September 2017 um 12:31 Uhr


1092300cookie-checkMehrfach-Paginierung (Ajax) funktioniert nicht für Django-el-Paginierung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy