这是我定义事件和日历模型的代码:
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