Django 会话设置默认密钥用法
Django sessions set default key usage
所以我有一个关于会话密钥的问题,通常当用户第一次访问该站点时,会话密钥不存在,因此您必须设置一个默认值。
set_date = request.session.get('set_date', '2017-07-06')
我使用会话来存储用户给定的日期并在不同的视图中使用该日期。下面的代码几乎完全符合我的要求,至少没有默认设置。当我为 'set_date' 设置默认值时,我似乎无法在不同的视图中使用日期,一旦我切换视图,默认值就会再次设置。
将默认值设置为 '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
提前致谢!
在您的问题中您提到了 get
,其中 returns 如果密钥不存在则为默认值,但未设置默认值。
使用setdefault
设置key不存在时的默认值
set_date = request.session.setdefault('set_date', '2017-07-06')
@Alasdair 肯定给出了正确的 Pythonic 答案,但您也可以使用 Django 的 session.get
方法 (django docs).
request.session.get('key_you_want', default='your_default_value')
同样重要的是要知道 request.session.get
如果键不存在 .
将不会抛出错误
所以我有一个关于会话密钥的问题,通常当用户第一次访问该站点时,会话密钥不存在,因此您必须设置一个默认值。
set_date = request.session.get('set_date', '2017-07-06')
我使用会话来存储用户给定的日期并在不同的视图中使用该日期。下面的代码几乎完全符合我的要求,至少没有默认设置。当我为 'set_date' 设置默认值时,我似乎无法在不同的视图中使用日期,一旦我切换视图,默认值就会再次设置。
将默认值设置为 '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
提前致谢!
在您的问题中您提到了 get
,其中 returns 如果密钥不存在则为默认值,但未设置默认值。
使用setdefault
设置key不存在时的默认值
set_date = request.session.setdefault('set_date', '2017-07-06')
@Alasdair 肯定给出了正确的 Pythonic 答案,但您也可以使用 Django 的 session.get
方法 (django docs).
request.session.get('key_you_want', default='your_default_value')
同样重要的是要知道 request.session.get
如果键不存在 .