我正在使用Django应用程序,用户可以拥有多个帐户。应用中的所有功能都应与当前选定的帐户相关联。例如,如果用户想要修改帐户的偏好设置,当他们点击偏好设置时,应用应该提取他们正在使用的帐户的偏好设置。
最初,我尝试使用会话来设置当前帐户,但无法让它工作。经过进一步阅读,这似乎是一个糟糕的选择。我现在正在做的是将account_id(aid)作为URL变量传递给每个视图,并将其传递给模板。
urls.py
url(r"^(?P<aid>\d+)/categories/$", views.manage_categories),
url(r"^(?P<aid>\d+)/preferences/$", views.manage_preferences),
url(r"^(?P<aid>\d+)/transactions/$", views.manage_transactions),
url(r"^(?P<aid>\d+)/transactions/(?P<pk>\d+)/$", views.edit_transaction),
views.py
def manage_categories(request, aid=None):
...
def edit_transaction(request, aid=None, pk=None):
...
因此,当他们浏览应用时,所选帐户可用于每个视图以用于过滤数据库结果。似乎可以有更好的方法来管理它,因为它需要将帐户ID传递给每个视图,并将其传递给每个模板。我喜欢使用会话来管理它的想法,但不清楚如何使这项工作。在URL中使用帐户ID的解决方案是否是一种合理的方法来实现这一目标?
答案 0 :(得分:2)
这可以使用用户会话轻松解决。已经内置了一个,请参阅Django's sessions framework。
使用数据库后端的Django默认会话的第一步:
在django.contrib.sessions.middleware.SessionMiddleware
MIDDLEWARE_CLASSES
添加到settings.py
在django.contrib.sessions
INSTALLED_APPS
添加到settings.py
运行manage.py migrate
以创建存储会话数据的数据库表
现在,您可以在视图中使用会话。 From the docs:
当SessionMiddleware被激活时,每个HttpRequest对象 - 任何Django视图函数的第一个参数 - 将具有一个session属性,这是一个类似字典的对象。
您可以在视图中的任何位置阅读并写入request.session。您可以多次编辑它。
我会使用视图选择一个帐户并将其保存到用户的会话中:
request.session['account'] = aid
之后你可以这样读取这个值:
request.session.get('account', None)