简体   繁体   English

单击模板中的按钮或链接时,如何从 django CBV(ListView) 返回有序对象

[英]How to return ordered objects from django CBV(ListView) when you click a button or link in the template

So I'm building an e-commerce store with Django(First project after learning).所以我正在用 Django 建立一个电子商务商店(学习后的第一个项目)。 I need to click on Sort in the template, and have the CBV return an object that's ordered by either, price, or whatever field I specify in the request.我需要单击模板中的排序,并让 CBV 返回按价格或我在请求中指定的任何字段排序的 object。 This is what I have so far这是我到目前为止所拥有的

Template Sort by Lowest Price按最低价格排序的模板

View看法

class ClotheListView(ListView):
model = Clothe
paginate_by = 8

def get_filter_param(self):
    # Grab the absolute url and then retrieve the filter param
    filter_param = self.request.path.split("/")[-1]
    return filter_param

def get_queryset(self):
    filter_param = self.get_filter_param()
    if(filter_param != ""):
        queryset = self.model.objects.filter(cloth_gender=filter_param)
    else:
        queryset = self.model.objects.all()
    return queryset

    return clothes_filtered_list.qs

def get_ordering(self):
    ordering = self.request.GET.get('ordering', '-cloth_price')
    return ordering

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    return context

Url.py Url.py

urlpatterns = [
path('', views.ClotheListView.as_view(), name="clothe_list"),
path('<slug:slug>', views.ClotheListView.as_view(),
     name="clothe_list_category"),
path('<int:pk>/', views.ClotheDetailView.as_view(), name="clothe_detail")

] ]

ok, so this is how I did it:好的,我就是这样做的:

Template模板

 <span class="float-end d-none d-lg-block mt-3"> Sort by: Price - <a href="{{request.path}}?ordering=-cloth_price">High To Low</a> | Price: <a href="{{request.path}}?ordering=+cloth_price">Low to High</a> </span>

View看法

class ClotheListView(ListView):

model = Clothe
paginate_by = 8

def get_filter_param(self):
    # Grab the absolute url and then retrieve the filter param
    filter_param = self.request.path.split("/")[-1]
    return filter_param

def get_queryset(self):
    # code for price sorting
    default_order = "cloth_name"
    order_param = ""
    user_filter = ""
    try:
        order_param = self.request.GET.get('ordering').strip()
    except:
        pass

    try:
        user_filter = self.request.GET.get('filter').strip()
    except:
        pass

    order_by = order_param or default_order
    # End of sorting code

    filter_param = self.get_filter_param()
    if(filter_param != "" or not filter_param):
        if(user_filter != ""):
            queryset = self.model.objects.filter(
                cloth_gender=filter_param, cloth_category=user_filter)
        else:
            queryset = self.model.objects.filter(
                cloth_gender=filter_param)
    else:
        queryset = self.model.objects.all()
    return queryset.order_by(order_by)

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    return context

url.py url.py

urlpatterns = [
path('', views.ClotheListView.as_view(), name="clothe_list"),
path('<slug:slug>', views.ClotheListView.as_view(),
     name="clothe_list_category"),
path('<int:pk>/', views.ClotheDetailView.as_view(), name="clothe_detail")
]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM