Django Context Processor和Form变量

时间:2011-09-26 04:43:50

标签: python django django-forms

我的site_base.html中有一个表单,它扩展到我的所有模板。

在我的site_base.html中,有一个下拉表单,允许用户更改其角色。根据所选角色,模板会更改。

我曾想过要通过context processor来保留这些信息,但是我在编写正确的逻辑时遇到了问题,这种逻辑会持久保存表单值。

所以基本上当用户选择了他的角色时,我使用role_id来填充我的网址,但是我不能这样做,因为每当我点击一个新的时候我都会获得null值感谢我在context_processor中的逻辑。

我是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 个答案:

答案 0 :(得分:1)

在第一次设置时,将值存储在会话中(在视图中,而不是上下文处理器中)。

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

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

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