【问题标题】:I need a good way to divide a list in Django list view我需要一种在 Django 列表视图中划分列表的好方法
【发布时间】:2020-09-23 14:10:06
【问题描述】:

我正在制作一个学生管理程序。

目前,分页和搜索功能已编码为查询,并结合使用,但由于我们每年都会收到新学生,school_year 很重要。

我想查看school_year 的学生列表,我想通过按右上角的年份来查看。

我一直在考虑将其实现为查询,但它似乎太复杂了(我认为与已经创建的查询结合起来太复杂了),并且没有必要为每个年级制作一个列表视图。

请给我一些好主意或解决方案

listveiw template IMG

views.py:

class StudentList(ListView):

    model = Student
    template_name = 'student/orders.html'
    context_object_name = 'students'
    paginate_by = 12


    def get_queryset(self):
        keyword = self.request.GET.get('keyword')

        if keyword:
            object_list = self.model.objects.filter(
            Q(name__icontains=keyword) | Q(email__icontains=keyword) | Q(student_mobile__icontains=keyword)
            )
        else:
            object_list = self.model.objects.all()

        return object_list


    def get_context_data(self, **kwargs):
        context = super(StudentList, self).get_context_data(**kwargs)
        paginator = context['paginator']
        page_numbers_range = 5  # Display only 5 page numbers
        max_index = len(paginator.page_range)

        page = self.request.GET.get('page')
        current_page = int(page) if page else 1

        start_index = int((current_page - 1) / page_numbers_range) * page_numbers_range
        end_index = start_index + page_numbers_range
        if end_index >= max_index:
            end_index = max_index

        page_range = paginator.page_range[start_index:end_index]
        context['page_range'] = page_range

        # for combine filterign and paging
        # https://stackoverflow.com/questions/51389848/how-can-i-use-pagination-with-django-filter
        if self.request.GET.get('keyword'):
            keyword = self.request.GET.copy()
            if self.request.GET.get('page'):
                del keyword['page']
            context['keyword'] = keyword.urlencode()

        return context


class StudentDetail(DetailView):
    model = Student
    template_name = 'student/member.html'
    context_object_name = 'student'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['pk'] = Student.objects.filter(pk=self.kwargs.get('pk'))
        return context

【问题讨论】:

    标签: django django-views


    【解决方案1】:
    1. 在您的搜索页面中,您可以添加包含所有可能年份的选择器。然后,在您的 get_queryset_data 中添加:
    year = self.request.GET.get('name_of_the_year_selector')
    if year:
        object_list = object_list.filter(year=int(year))
    return object_list
    
    
    1. 如果您想要每年的特定网址,那么您应该在 urls.py 中添加另一个路径:
    path('student/<int:year>/, StudentsList.as_view(), 'students-by-year')
    

    然后您可以尝试将此代码添加到您的 StudentList 中:

    def setup(self, **kwargs):
         self.year = kwargs['year']
    def get_queryset(self)
        if self.year:
            return self.model.objects.filter(year=int(self.year)
        if keyword:
    ....
    

    【讨论】:

    【解决方案2】:

    我做到了。谢谢博尔岑科

    view.py

    def get_queryset(self): #context over writing
        keyword = self.request.GET.get('keyword')
        school_year = self.kwargs.get('school_year')
        school_year = str(school_year)
    
        if keyword:
            object_list = self.model.objects.filter(
            Q(name__icontains=keyword) | Q(email__icontains=keyword) | 
            Q(student_mobile__icontains=keyword)
            ).filter(school_year=school_year)
        else:
            object_list = self.model.objects.all().filter(school_year=school_year)
    
        return object_list
    

    urls.py

    path('student/<str:school_year>/', views.StudentList.as_view(), name='student_list'),
    

    【讨论】:

      【解决方案3】:

      我见过最好最简单的分页器是uni_paginator

      免责声明。我是它的作者。

      您可以开始使用它,或者深入研究代码,看看它是如何工作的。很乐意回答任何问题。

      这里是link

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-10
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2014-02-05
        相关资源
        最近更新 更多