Django上下文处理器和表单变量

2 投票
1 回答
892 浏览
提问于 2025-04-17 03:04

我在我的 site_base.html 文件里有一个表单,这个文件会被我所有的模板使用。

在这个 site_base.html 里,有一个下拉菜单,用户可以通过它来更改自己的角色。根据用户选择的角色,模板的内容会发生变化。

我想通过一个叫做 context processor 的东西来保存这个信息,但我在写逻辑的时候遇到了一些问题,无法正确保存表单的值。

简单来说,当用户选择了自己的角色后,我想用这个 role_id 来填充我的网址,但每次点击新链接时,由于我在 context_processor 中的逻辑,我总是得到一个 null 值,这让我无法实现。

我对 Python 和 Django 还不太熟悉,不太确定该怎么做。

在实际应用中,类似的好例子就是 GitHub 的账户上下文切换器。

site_base.html 中的表单

123             <form name="context" method="post" action="">{% csrf_token %}
124                 <div class="input_group">
125                     <select name="role" onchange="contextform();">
126                         <option value="none">Select Context</option>
127                         {% for role in request.user.get_or_create_profile.roles.all %}
128                         <option value="{{ role.id }}" {% ifequal role.id current_role.id %}selected="selected"{% endifequal %}>{{ role.name }} for {{ role.event }}</option>
129                         {% endfor %}
130                     </select>
131                 </div>
132                 {{ current_role }}
133             </form>

简单的 context.processor.py

  3 def context_switcher(request):
  4     """
  5     Get a user's role 
  6     """
  7     if 'role' in request.POST:
  8         role_id = request.POST.get('role')
  9         current_role = Role.objects.filter(id=role_id)[0]
 10     else:
 11         current_role = ''
 12     return {'current_role': current_role}

1 个回答

1

在视图中(不是在上下文处理器里),一旦第一次设置了值,就把这个值存到会话里。

request.session['role_id'] = request.POST['role']

然后每次在你的上下文处理器中,你都可以获取到实际的角色对象:

current_role = Role.objects.get(role_id=request.session['role_id'])

撰写回答