我的django listview工作正常。
它接收url参数以过滤数据。 它的分页。
现在,我想在用户会话中维护这些数据。 (页码和url参数)。
示例:
返回产品列表视图时,我想保留搜索参数'foo'并选择第2页。
什么是更好的方法?
我正在使用Django 2.0.6
Models.py
class Product(models.Model):
name= models.CharField(_('name'), max_length=150)
price = models.DecimalField(max_digits=10, decimal_places=2, default=0.0)
Views.py
class ProductList(ListView):
model = Product
paginated_by = 10
def get_queryset(self):
queryset = Product.objects.all()
name = self.request.GET.get('name', None)
if name:
queryset = queryset.filter(name__icontains=name)
return queryset
Urls.py
path('products/', views.ProductList.as_view(), name='product_list'),
答案 0 :(得分:0)
为此,您必须将URL放入获取请求中,以便可以从URL获取获取值,并在过滤器中使用它们来保持选择,例如:
url/?variable=value
然后在Django视图中,您可以通过request.GET.get('variable')
访问此变量,并将其作为上下文传递到HTML渲染页面中,然后在选择的过滤器中使用该变量。
在会话中设置变量:
要在会话中设置变量,可以通过以下方式设置它:
request.session['variable'] = 'value'
此值可以通过以下方式检索:
if 'variable' in request.session:
variable1 = request.session['variable']
您可以参考this docs。
答案 1 :(得分:0)
我用来执行此操作的一个常用技巧是使用 GET 参数 并在会话中直接保存整个 url(与单独保存每个参数相比,它可以节省时间)
class ProductList(ListView):
model = Product
paginated_by = 10
def get_queryset(self):
self.request.session['saved_product_list_url'] = self.request.get_full_path()
....
然后你可以像这样在模板中使用它:
<a href="{% if request.session.saved_product_list_url %}{{ request.session.saved_product_list_url }}{% else %}{% url 'product_list' %}{% endif %}">product list</a>
或者像这样在视图中:
saved_product_list_url = self.request.session.get('saved_product_list_url')
if saved_product_list_url:
return redirect(saved_product_list_url)
else:
return redirect('product_list')
同样在您的过滤器表单中,您应该添加一个“重置过滤器”,如下所示:
<a href="{% url 'product_list' %}">reset filters</a>