猿问

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

我有一个Django listview工作正常。

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

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

例子:

  • 我在产品列表视图中。

  • 我搜索“ foo”

  • 我选择第2页

  • 然后,我单击任何产品详细信息。

  • 该页面将重定向到详细信息视图。

返回产品列表视图时,我想保留搜索参数'foo'并选择页面2。

有什么更好的方法来做到这一点?

我正在使用Django 2.0.6

型号


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'),


慕尼黑5688855
浏览 158回答 2
2回答

阿波罗的战车

为此,您必须将URL作为获取请求,以便可以从URL获取获取值,并在过滤器中使用它们来保持您的选择,例如:url/?variable=value然后,在Django视图中,您可以通过访问它,request.GET.get('variable')并将其作为上下文传递到HTML渲染页面中,然后在过滤器选择中使用该变量。在会话中设置变量:要在会话中设置变量,可以通过以下方式设置:request.session['variable'] = 'value' 可以通过以下方式检索此值:if 'variable' in request.session:    variable1 = request.session['variable']您可以参考此文档。

神不在的星期二

我执行此操作的一个常见技巧是使用GET参数并直接将整个url保存在会话中(与分别保存每个参数相比,它节省了时间)class ProductList(ListView):&nbsp; &nbsp; model = Product&nbsp; &nbsp; paginated_by = 10&nbsp; &nbsp; def get_queryset(self):&nbsp; &nbsp; &nbsp; &nbsp; self.request.session['saved_product_list_url'] = self.request.get_full_path()&nbsp; &nbsp; &nbsp; &nbsp; ....然后,您可以在模板中像这样使用它:<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:&nbsp; &nbsp; return redirect(saved_product_list_url)else:&nbsp; &nbsp; return redirect('product_list')同样在您的过滤器表单中,您应该添加“重置过滤器”,如下所示:<a href="{% url 'product_list' %}">reset filters</a>
随时随地看视频慕课网APP

相关分类

Python
我要回答