【问题标题】:Django Class Based Views keep url parameters in sessionDjango 基于类的视图将 url 参数保留在会话中
【发布时间】:2018-12-09 13:23:01
【问题描述】:

我的 django listview 工作正常。

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

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

例子:

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

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

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

我正在使用 Django 2.0.6

模型.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

网址.py

path('products/', views.ProductList.as_view(), name='product_list'),

【问题讨论】:

  • 您可以将所需的数据存储到django session 或像其他答案一样将它们保留在 URL 中并通过 GET 请求访问它们。

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


【解决方案1】:

我用来执行此操作的一个常见技巧是使用 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>

【讨论】:

    【解决方案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']
    

    您可以参考this docs

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 2020-10-04
      • 1970-01-01
      • 2013-03-23
      • 2015-04-30
      • 2012-12-28
      • 2019-03-14
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多