无法将关键字“calendar_id”解析为字段。选项包括:描述、结束日期、事件、ID、名称、所有者、所有者 ID、开始日期

问题描述 投票:0回答:1

这是我定义事件和日历模型的代码:

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
django django-models django-views django-forms
1个回答
0
投票

您使用

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

© www.soinside.com 2019 - 2024. All rights reserved.