Skip to main content
 首页 » 编程设计

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

2025年05月04日6rubylouvre

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

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

我曾想过通过上下文处理器 来保留此信息,但我在编写将保留表单值的正确逻辑时遇到了问题。

所以基本上当用户选择了他的角色时,我正在使用 role_id 来填充我的 url,但我不能这样做,因为我将得到一个 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} 

请您参考如下方法:

第一次设置该值后,立即将其存储在 session 中(在 View 中,而不是上下文处理器中)。

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

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

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