我想根据我的问题得到你的帮助:StopIteration
。
原则:
我有一个函数,它作为参数获取 id 列表和特定 id。这个 id 列表对应于一个带有分页的数组。
当我在这个数组中创建一个新对象时调用这个函数。创建对象后,我将被重定向到数组中的好页面。
我的功能:
def get_pagination(my_list_of_objects, pk):
# if object doesn't exist, add id to list of objects
if pk not in my_list_of_objects:
my_list_of_objects.append(pk)
# Get the list of objects code splitted by PAGE_LIMIT sorted by code (default)
my_list_of_objects_code = MyModel.objects.values_list('code', flat=True).filter(id__in=my_list_of_objects)
pagination = [my_list_of_objects_code[x:x + settings.PAGE_LIMIT] for x in range(0, len(my_list_of_objects_code), settings.PAGE_LIMIT)]
# Get first and last page number
first_page = 1
last_page = len(pagination)
# Get sublist index (e.g page number for specific id)
page_number = (next(index for index, value in enumerate(pagination) if pk in value)) + 1
return pagination, first_page, last_page, page_number
通过这种方式:
my_list_of_objects:对象 ID 列表
my_list_of_objects_code:按代码排序的对象列表
分页:将列表拆分为包含 n 个元素的子列表。n 对应设置中设置的分页。
first_page:首页编号(例如默认为 1)
last_page: last_page 编号(例如子列表的数量)
page_number:获取我创建的对象所在的页码
例子:
settings.PAGE_LIMIT = 5
pk: 119
my_list_of_objects_code: <QuerySet ['a', 'aa', 'aaa', 'aaaa', 'aasza', 'abaaa', 'aqqq', 'asz', 'asza', 'awq', 'azazaza', 'azeaze', 'bgre', 'cdezf', 'da',...]>
pagination: [['a', 'aa', 'aaa', 'aaaa', 'aasza'], ['abaaa', 'aqqq', 'asz', 'asza', 'awq'], ['azazaza', 'azeaze', 'bgre', 'cdezf', 'da']...]
first_page: 1
last_page: 18
问题:
当我调用我的函数时,我遇到了这个问题:
异常类型:StopIteration
get_pagination 1830 中的文件“/home/Bureau/Projets/APP/my_app/src/my_app/views/main.py”。page_number = (next(index for index, value in enumerate(pagination) if pk in value)) + 1
我不明白如何通过这个问题。如果我需要try/except
我必须做什么?
谢谢
编辑:
def get_pagination(my_list_of_objects, pk):
# if object doesn't exist, add id to list of objects
if pk not in my_list_of_objects:
my_list_of_objects.append(pk)
# Get the list of objects code splitted by PAGE_LIMIT sorted by code (default)
my_list_of_objects_code = MyModel.objects.values_list('code', flat=True).filter(id__in=my_list_of_objects)
pagination = [my_list_of_objects_code[x:x + settings.PAGE_LIMIT] for x in range(0, len(my_list_of_objects_code), settings.PAGE_LIMIT)]
# Get first and last page number
first_page = 1
last_page = len(pagination)
try:
page_number = (next(index for index, value in enumerate(pagination) if MyModel.objects.get(pk=pk).code in value)) +1
except StopIteration:
page_number = 1
return pagination, first_page, last_page, page_number