基于Django类的视图将url参数保留在会话中

时间:2018-06-30 17:34:12

标签: python django django-class-based-views

我的django listview工作正常。

它接收url参数以过滤数据。 它的分页。

现在,我想在用户会话中维护这些数据。 (页码和url参数)。

示例:

  • 我在产品列表视图中。
  • 我搜索“ foo”
  • 我选择第2页
  • 然后,我单击任何产品详细信息。
  • 页面将重定向到详细信息视图。

返回产品列表视图时,我想保留搜索参数'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'),

2 个答案:

答案 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>