Не удается преобразовать ключевое слово 'calendar_id' в поле. Варианты: описание, дата окончания, событие, id, имя, владелец, owner_id, дата начала

Вот код, в котором я определяю модели Event и Calendar:

class Calendar(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True, null=True)
    start_date = models.DateField()
    end_date = models.DateField()
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Event(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True, null=True)
    date = models.DateField( )
    start_time = models.TimeField()  # Example default time
    duration = models.DurationField()  # Example default duration of 1 hour
    calendar = models.ForeignKey(Calendar, on_delete=models.CASCADE)
    # owner = models.ForeignKey(User, on_delete=models.CASCADE)


    def __str__(self):
        return self.name

Вот представление, которое я пытаюсь использовать:

class EventListView(LoginRequiredMixin, ListView):
    model = Event
    template_name = 'list.html'
    context_object_name = 'EventListView'

    def get_queryset(self):
        calendar_id = self.kwargs['calendar_id']
        return Calendar.objects.filter(calendar_id=calendar_id)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if not self.request.user.is_authenticated:
            for event in context['EventListView']:
                event.name = ''
        return context

У меня есть еще одно похожее представление, которое выглядит следующим образом, также используя calendar_id, и это представление работает нормально. Я не уверен, почему EventListView показывает эту ошибку.



class CalendarDetailView(DetailView):
    model = Calendar
    template_name = 'calendars/detail.html'
    context_object_name = 'calendar'
    pk_url_kwarg = 'calendar_id'

    def get_queryset(self):
        return Calendar.objects.all()

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

Вы использовали Calendar в качестве модели, а не Event в .get_queryset():

class EventListView(LoginRequiredMixin, ListView):
    model = Event
    template_name = 'list.html'
    context_object_name = 'EventListView'

    def get_queryset(self):
        calendar_id = self.kwargs['calendar_id']
        # 🖟 not Calendar
        return Event.objects.filter(calendar_id=calendar_id)

Однако, вероятно, лучше сделать вызов super(), чтобы можно было включить дополнительную фильтрацию и т.д.:

class EventListView(LoginRequiredMixin, ListView):
    model = Event
    template_name = 'list.html'
    context_object_name = 'EventListView'

    def get_queryset(self, *args, **kwargs):
        return (
            super()
            .get_queryset(*args, **kwargs)
            .filter(calendar_id=self.kwargs['calendar_id'])
        )

Примечание: обычно имена контекстных объектов в модели Django записываются в snake_case, а не PascalCase, поэтому должно быть: event_list вместо EventListView.

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