Django ListView自定义查询集

Sir*_*rah 13 python django listview views

希望这应该是一个简单的帮助我.

我有一个包含下拉菜单的页面,其中包含三个项目:

<form method="GET">

    <select name="browse">

        <option>Cats</option>

        <option>Dogs</option>

        <option>Worms</option>

    </select>

 <input type="submit" value="Submit" />

</form>

<!-- Output table -->

  <table id="myTable">

      <thead>
          <tr>
            <th>Name</th>
            <th>Colour</th>
          </tr>
      </thead>

      <tbody>
      {% for object in object_list %}
          <tr>
            <td>{{ object.name }}</td>
            <td>{{ object.colour }}</td>
          </tr>
      {% endfor %}
      </tbody>

  </table>

<!-- Pagination controls -->

<div class="pagination">
    <span class="page-links">
        {% if page_obj.has_previous %}
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}
        <span class="page-current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>
        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>
Run Code Online (Sandbox Code Playgroud)

当用户选择一个项目并点击提交时,它们会在通用ListView生成的表格中得到结果:

class Browse(generic.ListView):
    template_name = 'app/browse.html'
    paginate_by = 25

    def get_queryset(self):
        queryset = Cats.objects.all()
        if self.request.GET.get("browse"):
            selection = self.request.GET.get("browse")
            if selection == "Cats":
                queryset = Cats.objects.all()
            elif selection == "Dogs":
                queryset = Dogs.objects.all()
            elif selection == "Worms":
                queryset = Worms.objects.all()
            else:
                queryset = Cats.objects.all()
        return queryset
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用分页控件转换页面时,查询集将重置为第一个(默认)项目Cats,因为(我认为)表单数据已重置.

知道如何规避这个问题吗?

谢谢!

PS:哦,就此而言,是否可以将查询集设置为无开始?非常感谢!

更新:当我在Cats查询集上使用分页时它工作正常,所以bug只显示在其他两个集合上.

Sir*_*rah 13

为了解决这个问题,我刚刚修改了分页HTML,以适应表单中的get请求和url字符串中的页码,如下所示:

<div class="pagination">
    <span class="page-links">
        {% if page_obj.has_previous %}
            <a href="/browse/?browse={{ input }}&page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}
        <span class="page-current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>
        {% if page_obj.has_next %}
            <a href="/browse/?browse={{ input }}&page={{ page_obj.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>
Run Code Online (Sandbox Code Playgroud)

这里的{{input}}是一个字符串,其中包含通过表单提交的选项,例如'Cats'或'Worms'.

为了能够将其传递给模板,我修改了基于类的视图的get_context_data方法,如下所示:

class Browse(generic.ListView):
    template_name = 'app/browse.html'
    paginate_by = 25

    # Modifying the get_context_data method

    def get_context_data(self, **kwargs):
        context = super(Browse, self).get_context_data(**kwargs)
        q = self.request.GET.get("browse")
        context['input'] = q
        return context

    def get_queryset(self):
        queryset = Cats.objects.all()
        if self.request.GET.get("browse"):
            selection = self.request.GET.get("browse")
            if selection == "Cats":
                queryset = Cats.objects.all()
            elif selection == "Dogs":
                queryset = Dogs.objects.all()
            elif selection == "Worms":
                queryset = Worms.objects.all()
            else:
                queryset = Cats.objects.all()
        return queryset
Run Code Online (Sandbox Code Playgroud)

就是这样,url字符串现在读取如下内容:

/browse/?browse=Cats&page=3
Run Code Online (Sandbox Code Playgroud)

所以就是这样,分页现在与表单的get方法一起工作.