Search code examples
pythondjangodjango-viewsdjango-querysetdjango-sessions

Django sessions set default key usage


So I have a question about session keys, normally when a user visits the site for the first time a session key does not exist yet hence you have to set a default.

set_date = request.session.get('set_date', '2017-07-06')

I use sessions to store an user given date and use this date in different views. The code below does almost exactly what I want it to do, at least without a default set. When I set a default value for 'set_date', I can't seem to use the date in different views, once I switch views the default is set again.

What's the right way to set a default to 'set_date'?

views.py

"""
Check-ins listview
"""

from .forms import DateSelection    

class CheckInsListView(generic.ListView, FormMixin): 
    form_class = DateSelection
    model = Delivery
    paginate_by = 10
    queryset = Delivery.objects.filter(status='AR')
    template_name = 'check-ins.html' 

    """
    Save the user given date in a session key set_date
    """

    def get_context_data(self, *args, **kwargs):
        context = super(CheckInsListView, self).get_context_data(*args, **kwargs)
        user_date = self.request.GET.get("date_selection")

        if user_date: # If user enters date
            self.request.session['set_date'] = user_date # Save given date in session
            context ['set_date'] = self.request.session['set_date'] # Sent date to context

        else: 
            context ['set_date'] = self.request.session['set_date'] # Use date from session

        return context

    """
    Use the date from session to filter the query results
    """

    def get_queryset(self):
        queryset = super(CheckInsListView, self).get_queryset()

        user_date = self.request.GET.get('date_selection')
        session_date = self.request.session['set_date'] 

        if user_date:
            return queryset.filter(arrival_date__icontains=user_date) # Filter on user given date

        else:
            return queryset.filter(arrival_date__icontains=session_date) # Filter on date from session

        return queryset # Return queryset without filter

Thanks in advance!


Solution

  • In your question you mention get, which returns a default value if the key does not exist, but does not set the default value.

    Use setdefault to set the default value when the key does not exist.

    set_date = request.session.setdefault('set_date', '2017-07-06')