Параметры запроса POST из представлений на основе классов - Разбиение на страницы - PullRequest
0 голосов
/ 31 мая 2018

Я использую модуль разбиения на страницы Django с представлениями на основе классов.

Мой Queryset будет содержать более 1000 объектов, которые мне нужно отображать по одному и исходя из отображаемого содержимого.

Мне не нужно показывать предыдущие страницы, мне просто нужно принять / отклонить, и при обоих щелчках он должен перейти на следующую страницу.

Мне нужно обновить несколько полей в базе данных, основываясь на том, что пользователь нажал Accept / Reject.Как я могу получить параметры запроса POST из шаблона в моем представлении на основе классов?чтобы я мог выполнять различные действия по нажатию кнопки «Принять / Отклонить»

Вот мой код:

#views.py

from django.views.generic import ListView
class DemoView2(ListView):

    model = MandateTable
    template_name = 'demo2.html'
    context_object_name = 'pg'
    paginate_by = 1
    queryset = MandateTable.objects.all()[:5] #For Testing purspose, working on only 5 objects

Шаблон

<!--demo2.html-->

{% for mandates in pg %}
        <p>{{ mandates.FIELD_1 }}</p>
        <p>{{ mandates.FIELD_2 }}</p>
        <p>{{ mandates.FELD_3 }}</p>
        <p>{{ mandates.FIELD_4 }}</p>
        <p>{{ mandates.FIELD_5 }}</p>
    {% endfor %}

{% if is_paginated %}
      <ul class="pagination">
        {% if page_obj.has_previous %}
          <li><a href="?page={{ page_obj.previous_page_number }}">&laquo;</a></li>
        {% else %}
          <li class="disabled"><span>&laquo;</span></li>
        {% endif %}

<button value="Accept" name="btn-accept" class="btn btn-success btn-lg">
            {% if page_obj.has_next %}
                <a style="text-decoration: none" href="?page={{ page_obj.next_page_number }}">Accept</a>
            {% else %}
                <a style="text-decoration: none" href="{% url 'demo' %}">Accept</a>
            {% endif %}
        </button>

        <button value="Reject" name="btn-reject" class="btn btn-danger btn-lg">
            {% if page_obj.has_next %}
                <a style="text-decoration: none" href="?page={{ page_obj.next_page_number }}">Reject</a>
            {% else %}
                <a style="text-decoration: none" href="{% url 'demo' %}">Reject</a>
            {% endif %}
        </button>
      </ul>
{% endif %}

Вот как работает мой шаблонсмотреть enter image description here

Я новичок в представлениях на основе классов с разбиением на страницы.

Цените всю помощь

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Это решение сработало для меня.

main.js

    $("#btn_reject").click(function () {
        //Fetch few parameters and send it along with clicked button in AJAX request
        var mNum = $("#mNum")[0].getAttribute('data-mn');
        var data = {"btn_name": "APPROVE", "m_number": mNum};
        man_verification(data);
    });

    $("#btn_reject").click(function () {
        //Fetch few parameters and send it along with clicked button in AJAX request
        var mNum = $("#mNum")[0].getAttribute('data-mn');
        var data = {"btn_name": "REJECT", "m_number": mNum};
        man_verification(data);
    });

     function man_verification(data) {
        $.ajax({
            type: "POST",
            url: "/review/",
            data: data,
            success: function (data) {
                //Code For Handlind Response Data
            },
            error: function (data) {
                console.log("Error", data);
            },
            beforeSend: function (xhr, settings) {
                if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
                    // Only send the token to relative URLs i.e. locally.
                    xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
                }
            }
        });
    }

views.py

class RevPageView(ListView):
    template_name = 'rev.html'
    queryset = db_query

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super(RevPageView, self).get_context_data(**kwargs)

        try:
            #Get data from db
        paginator = Paginator(db_query, 1)
        page = self.request.GET.get('page')
        try:
            query = paginator.page(page)
        except PageNotAnInteger:
            query = paginator.page(1)
        except EmptyPage:
            query = paginator.page(paginator.num_pages)
        context['data'] = query

        return context

    def post(self, request, *args, **kwargs):
        data_status = None
        if request.is_ajax():
            get_pk = request.POST.get('mandate_number')
            m_status = request.POST.get('btn_name')

            #Make necessary changes to the db tables based on the received parameters

        data = {"data_status": data_status}
        return JsonResponse(data)

Если есть лучший и эффективный подход, чем хотелось бызнать об этом:)

0 голосов
/ 31 мая 2018

Как насчет этого:

from django.views.generic import ListView
from django.urls import reverse
class DemoView2(ListView):

    model = MandateTable
    template_name = 'demo2.html'
    context_object_name = 'pg'
    paginate_by = 1
    queryset = MandateTable.objects.all()[:5] #For Testing purspose, working on only 5 objects

    def post(self, request, *args, **kwargs):
        if 'accept' in request.POST:
            # do acceptable stuff
            pass
        elif 'reject' in request.POST:
            # do rejectable stuff
            pass
        return super().get(request, *args, **kwargs)

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        page_obj = context['page_obj']
        if page_obj.has_next():
            context['next'] = "?page=" + str(page_obj.next_page_number())
        else:
            context['next'] = reverse('demo')
        return context

<!--demo2.html-->

<form method='post'>
{% csrf_token %}

{% for mandates in pg %}
        <p>{{ mandates.FIELD_1 }}</p>
        <p>{{ mandates.FIELD_2 }}</p>
        <p>{{ mandates.FELD_3 }}</p>
        <p>{{ mandates.FIELD_4 }}</p>
        <p>{{ mandates.FIELD_5 }}</p>
    {% endfor %}

{% if is_paginated %}
      <ul class="pagination">
        {% if page_obj.has_previous %}
          <li><a href="?page={{ page_obj.previous_page_number }}">&laquo;</a></li>
        {% else %}
          <li class="disabled"><span>&laquo;</span></li>
        {% endif %}
        <button name='accept' class="btn btn-danger btn-lg" type="submit" formaction={{ next }}>Accept</button>

        <button name='reject' class="btn btn-danger btn-lg" type="submit" formaction={{ next }}>Reject</button>
      </ul>
{% endif %}
</form>

Вам все равно нужно каким-то образом включить объекты, показанные на этой странице, в запрос. ПОЧТ, чтобы вы могли поработать над ними (может быть,используя скрытые входы).Никогда раньше не работал с нумерацией страниц.

...