Итерация по всем дням в месяце в шаблоне DJANGO
введите описание изображения здесь
У меня есть модель таблицы, как показано выше, которая содержит два столбца, в которых указаны даты, в которые продается товар в месяц.
Я хочу показать всю таблицу месяца в шаблоне Django вместо того, чтобы показывать только даты продаж, и в каждый день показывать "да", если продажа есть, и держать пустым, если продажи в этот день нет. Т.е. Как в шаблоне сделать итерацию по всем дням в месяце.
Как должен выглядеть код в Django "views.py" и в Template
models.py
class SaleDates(models.Model):
date_of_sale = models.DateTimeField(blank=True, null=True)
sold_choices = (
('yes', 'yes'),
('no', 'no'),
)
sold_status = models.CharField(max_length=9, choices=sold_choices,)
template.html
{% for item in list %}
{% if forloop.first %}
<table class="table table-hover table-bordered">
<tr>
<th>Sl.NO</th>
<th>date</th>
<th>details</th>
</tr>
{% endif %}
<tr>
<td>
{{ forloop.counter }} <br/>
</td>
<td> {{ item.date_of_sale }}</td>
<td>
{{ item.sold_status }}
</td>
</tr>
{% if forloop.last %}
</table>
{% endif %}
{% empty %}
{% endfor %}
Вы можете сделать что-то вроде этого, где мы сначала создаем список со всеми днями в месяце. После того как мы получили этот список, мы заполняем дни, в которые у нас есть продажи, этими продажами:
def get_month_dates(year, month):
num_days = monthrange(year, month)[1]
dates = [datetime(year, month, day) for day in range(1, num_days + 1)]
return dates
def sales_calendar(request):
today = datetime.today()
year = today.year
month = today.month
month_dates = get_month_dates(year, month)
sales = SaleDates.objects.filter(date_of_sale__year=year, date_of_sale__month=month)
sales_dict = {sale.date_of_sale.date(): sale.sold_status for sale in sales}
calendar = []
for date in month_dates:
status = sales_dict.get(date.date(), 'no')
calendar.append({'date': date, 'sold_status': status})
return render(request, 'template.html', {'calendar': calendar})
Кроме того, я бы удалил {% if forloop.first %}
из шаблона и просто поместил это в верхней части
<table class="table table-hover table-bordered">
<tr>
<th>Sl.NO</th>
<th>date</th>
<th>details</th>
</tr>
А затем после цикла forloop можно сделать <table/>
, это сделает ваш код намного более читабельным и будет работать так же :)