Django 如何使用函数 return 设置基于 class 的视图查询集
Django how to set a class based view queryset with function return
我正在尝试使用过滤后的数据进行无休止的分页,并通过 get 请求获取数据。
views.py:
class ProductsView(ListView):
paginate_by = 20
context_object_name = 'products'
template_name = "urunler.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
renkler = Renk.objects.all()
beden = Varyasyon.objects.all()
katagori = Grub.objects.all()
order = self.request.GET.get('order')
filtered = Stok.objects.all().order_by('-urun_id__kayit_tarihi','foto').distinct('urun_id__kayit_tarihi','foto')
checked_var = self.request.GET.getlist('varyasyon_id__in')
checked_renk = self.request.GET.getlist('renk_id__in')
checked_kat = self.request.GET.getlist('grub_id__in')
if self.request.GET.getlist("varyasyon_id__in"):
filtered = filtered.filter(
Q(varyasyon_id__in = self.request.GET.getlist("varyasyon_id__in"))
)
if self.request.GET.getlist("renk_id__in"):
filtered = filtered.filter(
Q(renk_id__in = self.request.GET.getlist("renk_id__in"))
)
if self.request.GET.getlist("grub_id__in"):
filtered = filtered.filter(
Q(grub_id__in = self.request.GET.getlist("grub_id__in"))
)
if order == "date":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
elif order == "sale":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(indirim = True)
)
elif order == "tesettur":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(urun_id__tesettur = True)
)
else:
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
context = {"renkler":renkler,"bedenler":beden,"katagoriler":katagori,'filtered':filters,'checkedvar':checked_var,'checkedrenk':checked_renk,'checkedkat':checked_kat}
self.queryset = context
return context
queryset = get_context_data()
我想从 get_context_data 的 return 设置查询集,但它要求自变量。
错误
TypeError: ProductsView.get_context_data() missing 1 required positional argument: 'self'
当我在顶部定义查询集时,它说 get_context_data 未定义。
也许您应该覆盖 get_queryset
方法。 queryset
不是 context
字典:
class ProductsView(ListView):
paginate_by = 20
context_object_name = 'products'
template_name = "urunler.html"
def get_queryset(self):
queryset = super().get_queryset()
# do stuff here to change queryset dynamically
...
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# do stuff here to update your context dict
...
return context
尝试像这样覆盖 get_queryset()
,然后使用 get_context_data
覆盖您的上下文,我试过了,它对我有用。
class ProductsView(ListView):
paginate_by = 12
context_object_name = 'filtered'
template_name = 'urunler.html'
def get_queryset(self):
order = self.request.GET.get('order')
filtered = Stok.objects.all().order_by('-urun_id__kayit_tarihi','foto').distinct('urun_id__kayit_tarihi','foto')
checked_var = self.request.GET.getlist('varyasyon_id__in')
checked_renk = self.request.GET.getlist('renk_id__in')
checked_kat = self.request.GET.getlist('grub_id__in')
if self.request.GET.getlist("varyasyon_id__in"):
filtered = filtered.filter(
Q(varyasyon_id__in = self.request.GET.getlist("varyasyon_id__in"))
)
if self.request.GET.getlist("renk_id__in"):
filtered = filtered.filter(
Q(renk_id__in = self.request.GET.getlist("renk_id__in"))
)
if self.request.GET.getlist("grub_id__in"):
filtered = filtered.filter(
Q(grub_id__in = self.request.GET.getlist("grub_id__in"))
)
if order == "date":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
elif order == "sale":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(indirim = True)
)
elif order == "tesettur":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(urun_id__tesettur = True)
)
else:
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
return filters
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
renkler = Renk.objects.all()
beden = Varyasyon.objects.all()
katagori = Grub.objects.all()
order = self.request.GET.get('order')
filtered = Stok.objects.all().order_by('-urun_id__kayit_tarihi','foto').distinct('urun_id__kayit_tarihi','foto')
checked_var = self.request.GET.getlist('varyasyon_id__in')
checked_renk = self.request.GET.getlist('renk_id__in')
checked_kat = self.request.GET.getlist('grub_id__in')
if self.request.GET.getlist("varyasyon_id__in"):
filtered = filtered.filter(
Q(varyasyon_id__in = self.request.GET.getlist("varyasyon_id__in"))
)
if self.request.GET.getlist("renk_id__in"):
filtered = filtered.filter(
Q(renk_id__in = self.request.GET.getlist("renk_id__in"))
)
if self.request.GET.getlist("grub_id__in"):
filtered = filtered.filter(
Q(grub_id__in = self.request.GET.getlist("grub_id__in"))
)
if order == "date":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
elif order == "sale":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(indirim = True)
)
elif order == "tesettur":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(urun_id__tesettur = True)
)
else:
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
context.update({"renkler":renkler,"bedenler":beden,"katagoriler":katagori,'checkedvar':checked_var,'checkedrenk':checked_renk,'checkedkat':checked_kat})
return context
首先 - 为什么您的代码失败。你覆盖 get_context_data
,然后对它进行无效调用(你根本没有将 self
传递给它),最后所有这一切都发生在 class 创建期间,而不是实例化,所以 get_context_data
在最后一行调用它时不知道请求。 context_data
和 queryset
不是一回事。您可以执行以下操作来获取 filtered
查询集的分页内容:
class ProductsView(ListView):
paginate_by = 20
context_object_name = 'filtered'
template_name = 'urunler.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update({
'renkler': Renk.objects.all(),
'bedenler': Varyasyon.objects.all(),
'katagoriler': Grub.objects.all(),
'checkedvar': self.request.GET.getlist('varyasyon_id__in'),
'checkedrenk': self.request.GET.getlist('renk_id__in'),
'checkedkat': self.request.GET.getlist('grub_id__in'),
})
return context
def get_queryset(self):
filtered = Stok.objects.all().order_by('-urun_id__kayit_tarihi','foto').distinct('urun_id__kayit_tarihi','foto')
checked_var = self.request.GET.getlist('varyasyon_id__in')
checked_renk = self.request.GET.getlist('renk_id__in')
checked_kat = self.request.GET.getlist('grub_id__in')
if checked_var:
filtered = filtered.filter(varyasyon_id__in=checked_var)
if checked_renk:
filtered = filtered.filter(renk_id__in=checked_renk)
if checked_cat:
filtered = filtered.filter(grub_id__in=checked_cat)
filtered = filtered.filter(urun_id__yayin=True, stok_adet__gt=0)
order = self.request.GET.get('order')
if order == "sale":
filtered = filtered.filter(indirim=True)
elif order == "tesettur":
filtered = filtered.filter(urun_id__tesettur=True)
return filtered
我正在尝试使用过滤后的数据进行无休止的分页,并通过 get 请求获取数据。
views.py:
class ProductsView(ListView):
paginate_by = 20
context_object_name = 'products'
template_name = "urunler.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
renkler = Renk.objects.all()
beden = Varyasyon.objects.all()
katagori = Grub.objects.all()
order = self.request.GET.get('order')
filtered = Stok.objects.all().order_by('-urun_id__kayit_tarihi','foto').distinct('urun_id__kayit_tarihi','foto')
checked_var = self.request.GET.getlist('varyasyon_id__in')
checked_renk = self.request.GET.getlist('renk_id__in')
checked_kat = self.request.GET.getlist('grub_id__in')
if self.request.GET.getlist("varyasyon_id__in"):
filtered = filtered.filter(
Q(varyasyon_id__in = self.request.GET.getlist("varyasyon_id__in"))
)
if self.request.GET.getlist("renk_id__in"):
filtered = filtered.filter(
Q(renk_id__in = self.request.GET.getlist("renk_id__in"))
)
if self.request.GET.getlist("grub_id__in"):
filtered = filtered.filter(
Q(grub_id__in = self.request.GET.getlist("grub_id__in"))
)
if order == "date":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
elif order == "sale":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(indirim = True)
)
elif order == "tesettur":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(urun_id__tesettur = True)
)
else:
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
context = {"renkler":renkler,"bedenler":beden,"katagoriler":katagori,'filtered':filters,'checkedvar':checked_var,'checkedrenk':checked_renk,'checkedkat':checked_kat}
self.queryset = context
return context
queryset = get_context_data()
我想从 get_context_data 的 return 设置查询集,但它要求自变量。
错误
TypeError: ProductsView.get_context_data() missing 1 required positional argument: 'self'
当我在顶部定义查询集时,它说 get_context_data 未定义。
也许您应该覆盖 get_queryset
方法。 queryset
不是 context
字典:
class ProductsView(ListView):
paginate_by = 20
context_object_name = 'products'
template_name = "urunler.html"
def get_queryset(self):
queryset = super().get_queryset()
# do stuff here to change queryset dynamically
...
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# do stuff here to update your context dict
...
return context
尝试像这样覆盖 get_queryset()
,然后使用 get_context_data
覆盖您的上下文,我试过了,它对我有用。
class ProductsView(ListView):
paginate_by = 12
context_object_name = 'filtered'
template_name = 'urunler.html'
def get_queryset(self):
order = self.request.GET.get('order')
filtered = Stok.objects.all().order_by('-urun_id__kayit_tarihi','foto').distinct('urun_id__kayit_tarihi','foto')
checked_var = self.request.GET.getlist('varyasyon_id__in')
checked_renk = self.request.GET.getlist('renk_id__in')
checked_kat = self.request.GET.getlist('grub_id__in')
if self.request.GET.getlist("varyasyon_id__in"):
filtered = filtered.filter(
Q(varyasyon_id__in = self.request.GET.getlist("varyasyon_id__in"))
)
if self.request.GET.getlist("renk_id__in"):
filtered = filtered.filter(
Q(renk_id__in = self.request.GET.getlist("renk_id__in"))
)
if self.request.GET.getlist("grub_id__in"):
filtered = filtered.filter(
Q(grub_id__in = self.request.GET.getlist("grub_id__in"))
)
if order == "date":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
elif order == "sale":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(indirim = True)
)
elif order == "tesettur":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(urun_id__tesettur = True)
)
else:
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
return filters
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
renkler = Renk.objects.all()
beden = Varyasyon.objects.all()
katagori = Grub.objects.all()
order = self.request.GET.get('order')
filtered = Stok.objects.all().order_by('-urun_id__kayit_tarihi','foto').distinct('urun_id__kayit_tarihi','foto')
checked_var = self.request.GET.getlist('varyasyon_id__in')
checked_renk = self.request.GET.getlist('renk_id__in')
checked_kat = self.request.GET.getlist('grub_id__in')
if self.request.GET.getlist("varyasyon_id__in"):
filtered = filtered.filter(
Q(varyasyon_id__in = self.request.GET.getlist("varyasyon_id__in"))
)
if self.request.GET.getlist("renk_id__in"):
filtered = filtered.filter(
Q(renk_id__in = self.request.GET.getlist("renk_id__in"))
)
if self.request.GET.getlist("grub_id__in"):
filtered = filtered.filter(
Q(grub_id__in = self.request.GET.getlist("grub_id__in"))
)
if order == "date":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
elif order == "sale":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(indirim = True)
)
elif order == "tesettur":
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0) & Q(urun_id__tesettur = True)
)
else:
filters = filtered.filter(
Q(urun_id__yayin = True) & Q(stok_adet__gt = 0)
)
context.update({"renkler":renkler,"bedenler":beden,"katagoriler":katagori,'checkedvar':checked_var,'checkedrenk':checked_renk,'checkedkat':checked_kat})
return context
首先 - 为什么您的代码失败。你覆盖 get_context_data
,然后对它进行无效调用(你根本没有将 self
传递给它),最后所有这一切都发生在 class 创建期间,而不是实例化,所以 get_context_data
在最后一行调用它时不知道请求。 context_data
和 queryset
不是一回事。您可以执行以下操作来获取 filtered
查询集的分页内容:
class ProductsView(ListView):
paginate_by = 20
context_object_name = 'filtered'
template_name = 'urunler.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update({
'renkler': Renk.objects.all(),
'bedenler': Varyasyon.objects.all(),
'katagoriler': Grub.objects.all(),
'checkedvar': self.request.GET.getlist('varyasyon_id__in'),
'checkedrenk': self.request.GET.getlist('renk_id__in'),
'checkedkat': self.request.GET.getlist('grub_id__in'),
})
return context
def get_queryset(self):
filtered = Stok.objects.all().order_by('-urun_id__kayit_tarihi','foto').distinct('urun_id__kayit_tarihi','foto')
checked_var = self.request.GET.getlist('varyasyon_id__in')
checked_renk = self.request.GET.getlist('renk_id__in')
checked_kat = self.request.GET.getlist('grub_id__in')
if checked_var:
filtered = filtered.filter(varyasyon_id__in=checked_var)
if checked_renk:
filtered = filtered.filter(renk_id__in=checked_renk)
if checked_cat:
filtered = filtered.filter(grub_id__in=checked_cat)
filtered = filtered.filter(urun_id__yayin=True, stok_adet__gt=0)
order = self.request.GET.get('order')
if order == "sale":
filtered = filtered.filter(indirim=True)
elif order == "tesettur":
filtered = filtered.filter(urun_id__tesettur=True)
return filtered