Ограничение просмотра на utils.py - Django

Я использовал tempalte для создания календаря с помощью Django, но теперь я застрял в необходимости ограничить просмотр событий в этом календаре только пользователем, который создал событие.

У меня нет модели для этого календаря, только для событий, и календарь в настоящее время основан на моем файле util.py:

utils.py

class Calendar(HTMLCalendar):
    def __init__(self, year=None, month=None):
        self.year = year
        self.month = month
        super(Calendar, self).__init__()

    # formats a day as a td
    # filter events by day
    def formatday(self, day, events):
        contracts_starting_per_day = events.filter(starting_date__day=day)
        contracts_ending_per_day = events.filter(ending_date__day=day)
        contracts_paying_per_day = events.filter(payment_date__day=day)
        d = ''


        for contract in contracts_starting_per_day:
            if contract.company_client:
                client = contract.company_client
            elif contract.person_client:
                client = contract.person_client
            else:
                client = '-'
            d += f"<a href='http://127.0.0.1:8000/contracts/editct/{contract.id}'> <li class='calendar-li starting' title='{contract.contract_name}'> {contract.contract_name} <p class='calendar-p'> {client} </p> </li> </a>"


        if day != 0:
            return f"<td class='calendar-td'><span class='date'>{day}</span><ul class='calendar-ul'> {d} </ul></td>"
        return "<td class='calendar-td'></td>"

    # formats a week as a tr
    def formatweek(self, theweek, events):
        week = ''
        for d, weekday in theweek:
            week += self.formatday(d, events)
        return f"<tr class='calendar-tr'> {week} </tr>"

    # formats a month as a table
    # filter events by year and month
    def formatmonth(self, withyear=True):
        contracts = Contract.objects.filter(starting_date__year=self.year, starting_date__month=self.month)

        cal = f'<table border="0" cellpadding="0" cellspacing="0" class="calendar">\n'
        cal += f'{self.formatmonthname(self.year, self.month, withyear=withyear)}\n'
        cal += f'{self.formatweekheader()}\n'
        for week in self.monthdays2calendar(self.year, self.month):
            cal += f'{self.formatweek(week, contracts)}\n'
        return cal

views.py

class CalendarView(LoginRequiredMixin, generic.ListView):
    model = Contract
    template_name = 'calendar.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # Get the actual month to display the calendar
        d = get_date(self.request.GET.get('month', None))
        agenda = Calendar(d.year, d.month)
        html_agenda = agenda.formatmonth(withyear=True)
        #context['calendar'] = context['calendar'].filter(user=self.request.user)
        context['calendar'] = mark_safe(html_agenda)
        context['prev_month'] = prev_month(d)
        context['next_month'] = next_month(d)
        return context


def get_date(req_day):
    if req_day:
        year, month = (int(x) for x in req_day.split('-'))
        return date(year, month, day=1)
    return datetime.today()


def prev_month(d):
    first = d.replace(day=1)
    prev_month = first - timedelta(days=1)
    month = 'month=' + str(prev_month.year) + '-' + str(prev_month.month)
    return month

def next_month(d):
    days_in_month = calendar.monthrange(d.year, d.month)[1]
    last = d.replace(day=days_in_month)
    next_month = last + timedelta(days=1)
    month = 'month=' + str(next_month.year) + '-' + str(next_month.month)
    return month

Я попробовал #context['calendar'] = context['calendar'].filter(user=self.request.user) на моих представлениях, но у меня возникла эта ошибка:

KeyError at /agenda/calendar 'calendar'

Есть ли возможность восстановить события в календаре, только если пользователь, вошедший в систему, и пользователь, создавший события, равны?

Я также пытался:

for contract in contracts_starting_per_day:
    if contract.user == request.user:

В моем Calendar util, но так как этот util не получает никаких запросов, его невозможно использовать.

Вы пытаетесь извлечь calendar из контекста, в то время как его еще нет в контексте. Ошибка возникает в этой строке:

context['calendar'] = context['calendar'].filter(user=self.request.user)

Вы должны определить queryset для вашей модели в методе get_queryset View. Этот кверисет будет доступен в контексте в переменной, которую вы зададите в context_object_name:

class CalendarView(...):
    ...
    context_object_name = 'contracts'
    def get_queryset(self):
        return Contract.objects.filter(user=self.request.user)

Затем в шаблоне:

{% for contract in contracts %}
    {{ contract }}
{% endfor %}
Вернуться на верх