Итерация по всем дням в месяце в шаблоне 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/>, это сделает ваш код намного более читабельным и будет работать так же :)

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