Не удается преобразовать ключевое слово '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