我正在创建一个允许创建事件的网站,这些事件将显示在主页和事件列表中,以便人们可以单击事件查看它们的描述,以及在事件中签到。我在添加新事件时获取类中的查询集以更新时遇到问题。
所以这个函数是针对我们的主页的。每次您返回页面时,query_set都会更新,因此添加新事件时,该事件会显示在此页面上。
def index(request):
num_future_events = Event.objects.filter(date__gte=today).filter(approved=True).count()
query_set = Event.objects.filter(date__gte=today).filter(approved=True).order_by('date', 'time')[:3]
context = {
'num_future_events': num_future_events,
'query_set': query_set
}
return render(request, 'index.html', context=context)
这是我网站上的事件列表页面的类。它使用查询集,但由于该类只调用一次,因此查询集只会随着类的初始化而更新。
class EventListView(generic.ListView):
model = Event
query_set = Event.objects.filter(date__gte=today).exclude(approved=False).order_by('date', 'time')[:21]
template_name = 'listPage.html'
def get_queryset(self):
return self.query_set
我希望得到一些帮助,以便在添加新事件时,EventListView 类中设置的查询会自动更新,以便它将显示在此页面上。
任何帮助将不胜感激。
如果我们看一下 Django 的源代码ListView
,我们会看到:
因此,def get_queryset(self): """ Return the list of items for this view. The return value must be an iterable and may be an instance of `QuerySet` in which case `QuerySet` specific behavior will be enabled. """ if self.queryset is not None: queryset = self.queryset if isinstance(queryset, QuerySet): queryset = queryset.all() elif self.model is not None: queryset = self.model._default_manager.all() else: raise ImproperlyConfigured( "%(cls)s is missing a QuerySet. Define " "%(cls)s.model, %(cls)s.queryset, or override " "%(cls)s.get_queryset()." % { 'cls': self.__class__.__name__ } ) ordering = self.get_ordering() if ordering: if isinstance(ordering, str): ordering = (ordering,) queryset = queryset.order_by(*ordering) return queryset
Django 每次构造一个新的查询集时,通过调用.all()
它会生成查询集的未评估克隆,从而强制重新评估。
在这种情况下,我建议您不要覆盖get_queryset
,而只需使用queryset
属性,例如:
class EventListView(generic.ListView):
model = Event
queryset= Event.objects.filter(
date__gte=today
).exclude(
approved=False
).order_by('date', 'time')[:21]
template_name = 'listPage.html'
或者,如果您确实想覆盖get_queryset
函数,您可以使用:
class EventListView(generic.ListView):
model = Event
template_name = 'listPage.html'
def get_queryset(self):
return Event.objects.filter(
date__gte=today
).exclude(approved=False).order_by('date', 'time')[:21]
或:
class EventListView(generic.ListView):
model = Event
template_name = 'listPage.html'
query_set = Event.objects.filter(
date__gte=today
).exclude(approved=False).order_by('date', 'time')[:21]
def get_queryset(self):
return self.query_set.all()