【问题标题】:Queried Results from Database Disappear on Pagination: Django来自数据库的查询结果在分页上消失:Django
【发布时间】:2020-02-26 08:31:11
【问题描述】:

我是使用 Django 框架的新手。我正在创建一个表单来接受用户输入来查询数据库。我想在同一页面的 from 字段下方显示查询的结果。我也能做到。但是,在实现分页并单击“下一步”链接或尝试使用“order_by”对结果进行排序后,查询的结果会从网页中消失。如何解决? 以下是我的代码文件:\ 视图.py:

    def get(self, request, *args, **kwargs):
        paginated_objects = []
        order_by = None
        form = QueryForm(request.GET)
        button_state = True
        if form.is_valid():
            max_traj_len = form.data["traj_len_user"]
            print(form.data["submit"])
            print(max_traj_len)
            order_by = request.GET.get('order_by', 'traj_len')  ##default order_by is set here
            backtrack_flag = form.data["backtrack_user"]
            print(backtrack_flag)
            queried_objects = list(collection.find({'traj_len':{'$lte':int(max_traj_len)}}))
            paginator = Paginator(queried_objects, 25)
            page = request.GET.get('page')
            paginated_objects = paginator.get_page(page)
            button_state = request.GET.get('submit')

        return render(request, self.template_name, {'form': form,'object_list': paginated_objects, 'order_by': order_by, 'button_state': button_state})

模板.html:

{% extends 'base.html' %}

{% block content %}
<form action='' method='get'>
{%  csrf_token %}
    <table>{{ form.as_table }}</table>
    <input type="submit" name="submit" value="Query">
</form>
    {% if button_state == 'Query' %}
    <table id="studata">
    <thead>
    <th><a href="?order_by=traj_id">Traj ID</a></th>
    <th><a href="?order_by=traj_path">Traj Path</a></th>
    <th><a href="?order_by=traj_len">Traj Length</a></th>
    <th><a href="?order_by=interpolated_id">Interpolated_ID</a></th>
    <th><a href="?order_by=inter_path">Interpolated Path</a></th>
    <th><a href="?order_by=inter_path_len">Interpolated Path Length</a></th>
    <th><a href="?order_by=backtrack">Backtrack</a></th>
    <th><a href="?order_by=reached_goal">Reached Goal</a></th>
    </thead>
    {% for obj in object_list %}<tr>
    <script type="text/javascript">
    var ele = {{ obj.traj_path }};
    var last_ele = ele.pop()
    //assuming 0 is the goal trajectory: change if another json is the goal state
    if(last_ele == 0){
        goal = "True"
    }
    else{
        goal = "False"
    }
    </script>
    <td><a href = '/hoc4/{{ obj.traj_id }}' >{{ obj.traj_id }}</a></td>
    <td>{{ obj.traj_path }}</td>
    <td>{{ obj.traj_len }}</td>
    <td>{{ obj.interpolated_id }}</td>
    <td>{{ obj.inter_path }}</td>
    <td>{{ obj.inter_path_len }}</td>
    <td>{{ obj.backtrack }}</td>
    <td><script type="text/javascript">
        document.write(goal)
      </script>
    </td>
    </tr>
    {% endfor %}
    </table>
    <div class="pagination">
    <span class="step-links">
        {% if object_list.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ object_list.previous_page_number }}&order_by={{ order_by }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ object_list.number }} of {{ object_list.paginator.num_pages }}.
        </span>

        {% if object_list.has_next %}
            <a href="?page={{ object_list.next_page_number }}&order_by={{ order_by }}">next</a>
            <a href="?page={{ object_list.paginator.num_pages }}&order_by={{ order_by }}">last &raquo;</a>
        {% endif %}
    </span>
    </div>
    {% endif %}
{%  endblock %}

forms.py:

class QueryForm(forms.Form):
    traj_len_user = forms.IntegerField(min_value=0, required=True)
    backtrack_user = forms.BooleanField()

【问题讨论】:

    标签: django django-rest-framework django-forms django-views django-pagination


    【解决方案1】:

    您正在做很多看起来甚至不需要的额外工作......您不需要用于查询任何内容的表单。您只需要 request.GETrequest.POST 中的任何内容。您可以通过request.GET.get('name_attribute_of_input')等方式访问它们。

    这里是如何使用 Paginator 类的相关部分。

    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    def get_something(request):
        object_list = MyModel.published.all()
        tag = None
        paginator = Paginator(object_list, 3)  # 3 objects on each page
        page = request.GET.get('page')  # this is getting the 'page' quesry string argument in the url as a GET request, so   ?page=whatever_url
        try:
            my_models = paginator.page(page)  # by itself without paginator, object_list would get all my_models and put it on one page. But the paginator object here converts the X objects into pages.
            # And those pages are reached by the page variable above that GET's it.
        except PageNotAnInteger:
            # If page is not an integer, deliver the 1st page
            my_models = paginator.page(1)
        except EmptyPage:
            # If page is out of range deliver last page of results
            my_models = paginator.page(paginator.num_pages)
        return render(request, 'blog_app/list.html', {'page': page, 'my_models': my_models})
    

    你的模板中会有这样的东西:

      {% if page.has_previous %}
        <a href="?page={{ page.previous_page_number }}">Previous</a>
      {% endif %}
    
      <span class="current">
        Page {{ page.number }} of {{ page.paginator.num_pages }}.
      </span>
    
      {% if page.has_next %}
        <a href="?page={{ page.next_page_number }}">Next</a>
      {% endif %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-30
      • 2017-10-08
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2013-04-16
      • 2020-07-09
      • 1970-01-01
      相关资源
      最近更新 更多