【发布时间】:2020-09-23 14:10:06
【问题描述】:
我正在制作一个学生管理程序。
目前,分页和搜索功能已编码为查询,并结合使用,但由于我们每年都会收到新学生,school_year 很重要。
我想查看school_year 的学生列表,我想通过按右上角的年份来查看。
我一直在考虑将其实现为查询,但它似乎太复杂了(我认为与已经创建的查询结合起来太复杂了),并且没有必要为每个年级制作一个列表视图。
请给我一些好主意或解决方案
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