社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

Django如何使用函数return设置基于类的视图查询集

Mehmet • 3 年前 • 1203 次点击  

我试图用过滤后的数据进行无休止的分页,并用get请求获取数据。

意见。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_数据的返回中设置queryset,但它要求自变量。

错误

TypeError: ProductsView.get_context_data() missing 1 required positional argument: 'self'

当我在顶部定义queryset时,它说get_context_数据没有定义。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131066
 
1203 次点击  
文章 [ 3 ]  |  最新文章 3 年前
SUTerliakov
Reply   •   1 楼
SUTerliakov    3 年前

首先——为什么你的代码失败。你超越 get_context_data ,然后对其进行无效调用(您没有通过 self 最后,所有这些都发生在类创建期间,而不是实例化期间,所以 获取上下文数据 当你在最后一行打电话时,他不知道你的请求。和 context_data 这和 queryset .以下是您可以做的,以获得的分页内容 filtered queryset:

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
Corralien
Reply   •   2 楼
Corralien    3 年前

也许你应该放弃 get_queryset 方法A. 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
M.Mevlevi
Reply   •   3 楼
M.Mevlevi    3 年前

尝试覆盖 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