@sazhyk

Как создать итератор двухэлементных кортежей?

Есть в моделях Django, в настройках полей аргумент choices, который в форме выведет <select> на странице. choices принимает
Итератор (например, список или кортеж) 2-х элементных кортежей, определяющих варианты значений для поля.
Пример из документации Django:
YEAR_IN_SCHOOL_CHOICES = (
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
    ('GR', 'Graduate'),
)

Вопрос собственно в следующем, как создать этот итератор в функции, если необходимо вернуть такой итератор:
YEARS_BIRTHS = (
    ('1950', '1950'),
    ('1951', '1951'),
    ('1952', '1952'),
    ...
)
Понимаю, что это элементарные вещи в python'е, но ни как не соображу.
  • Вопрос задан
  • 424 просмотра
Решения вопроса 2
@abcd0x00
>>> def gen(start, end):
...     return ((str(i), str(i)) for i in range(start, end + 1))
... 
>>> tuple(gen(1950, 1952))
(('1950', '1950'), ('1951', '1951'), ('1952', '1952'))
>>>
Ответ написан
Комментировать
@NaName
year_min = 1900
year_max = 2000

YEARS_BIRTHS = ((str(year_max), str(year_max)))
for year in range(year_min, year_max):
new_tuple = (str(year), str(year)),
YEARS_BIRTHS += new_tuple

print(YEARS_BIRTHS)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ulkoart
@ulkoart
def year_func(*args):
	res = ()
	for year in range(args[0], args[1]):
		res += ((str(year), str(year)),)
	return res


class ModelName(models.Model):
    year = models.CharField(max_length=50, choices=year_func(1990, 2000), verbose_name='год')


CharField - поменять на то что нужно Вам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы