Django:如何在基于 class 的视图中实现 request.session

Django: How to implement request.session in a class based view

我很难理解 Django 中基于 class 的视图。这时候我尝试在一个ListView中实现一个request.session。我尝试将以下基于函数的代码从 MdM Django Tutorial 中实现到 ListView。

def index(request):
    ...

    # Number of visits to this view, as counted in the session variable.
    num_visits = request.session.get('num_visits', 0)
    request.session['num_visits'] = num_visits + 1

    context = {
        'num_visits': num_visits,
    }

    return render(request, 'index.html', context=context)

我尝试了以下方法(以及许多其他方法)但无济于事:

class ListPageView(FormMixin, ListView):
    template_name = 'property_list.html'
    model = Property
    form_class = PropertyForm

    def get(self, request, *args, **kwargs):
        num_visits = request.session.get('num_visits', 0)
        request.session['num_visits'] = num_visits + 1

        return super().get(request, *args, **kwargs)

    # ... some more code here

在我的模板中有:

<p>You have visited this page {{ num_visits }}{% if num_visits == 1 %} time{% else %} times{% endif %}.</p>

但是模板变量始终呈现为空。

感谢您的帮助。非常感谢。

您仍然需要通过覆盖 get_context_data method [Django-doc]:

将其传递给上下文
class ListPageView(FormMixin, ListView):
    template_name = 'property_list.html'
    model = Property
    form_class = PropertyForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        <b>context['num_visits'] = self.request.session['num_visits']</b>
        return context

    def get(self, request, *args, **kwargs):
        num_visits = request.session.get('num_visits', 0)
        request.session['num_visits'] = num_visits + 1
        return super().get(request, *args, **kwargs)

我知道这是一个迟到的答案,但我 运行 遇到了同样的问题,我会尽力投入我的两分钱,也许我的答案会帮助像我这样的新手。

您的模板始终可以访问 {{ request }} 变量,因此您可以简单地使用 {{request.session.key}} 而无需定义额外的上下文。

我还看到您对复数使用了 {% if %} 条件,但 Django 有一个很好的过滤器 {{ value|pluralize }},它可能更有用。