Как преобразовать диапазон дат для заполнения выпадающего списка в django

class Trade(models.Model):
    user_id = models.CharField(max_length=5, null=True, blank=True)
    nse_index = models.ForeignKey('NseIndex', on_delete=models.CASCADE)
    trade_expiry = models.DateField(default=THURSDAYS[0], choices=THURSDAYS)
    trade_type = models.CharField(max_length=25, choices=TRADE_TYPE, default="paper")
    id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)

Мне нужно отобразить trade_expiry (все четверги в году) в виде кортежа для отображения в виде выпадающего списка на форме с помощью Django.

Это можно сделать с помощью понимания списка, возможно что-то вроде этого:

def all_specific_days(year, day):
  d = datetime.date(year, 1, 1)
  d += datetime.timedelta(days= d.weekday() - day)
  days = []
  while d.year == year:
      days.append(d)
      d += datetime.timedelta(days=7)
  return days

THURSDAYS = all_specific_days(2023, 3)
THURSDAYS_CHOICES = [(i, d) for i, d in enumerate(THURSDAYS)]

В результате будет возвращен список, который выглядит следующим образом:

[(0, datetime.date(2023, 1, 4)), (1, datetime.date(2023, 1, 11)),
...(51, datetime.date(2023, 12, 27))]

Надеюсь, это поможет вам, с помощью этого вы можете даже указать, какой год и какой день вам нужен. Помните, что понедельник = 0, а воскресенье = 6, поэтому четверг = 3.

РЕДАКТИРОВАНИЕ:

THURSDAYS_CHOICES = [(i, str(d)) for i, d in enumerate(THURSDAYS)]

Вернет список со строковым представлением даты ->

[(0, '2023-01-04'), (1, '2023-01-11'), (2, '2023-01-18')... 
..., (51, '2023-12-27')]

Я бы написал форму, т.е. что-то вроде этого:

class SelectOperatorChoiceForm(forms.Form):
    operator_select = forms.ModelChoiceField(queryset=None, label="choose the operator:")

def __init__(self, operators, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['operator_select'].queryset = operators  

в моем случае, при создании экземпляра формы, операторы являются queryset. Я думаю, вы сможете легко адаптировать этот код к вашей проблеме.

Вернуться на верх