我想创建一个始终可用的新变量,就像“用户”变量的工作方式一样。
这是我的 myapp/context_processors.py
def patient_selected(request):
print(hasattr(request, 'patient_selected_id'))
print( 'patient_selected_id' in locals())
print( 'patient_selected_id' in globals())
if not hasattr(request, 'patient_selected_id'):
request.patient_selected_id = 0
return {"patient_selected_id": 0}
Run Code Online (Sandbox Code Playgroud)
问题是,它总是打印“假”。看来我无法向请求添加属性,也无法创建始终可用的变量。顺便说一句,我已将此 context_processors.py 添加到设置中。这是我的设置:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'hrs.context_processors.patient_selected',
],
},
},
Run Code Online (Sandbox Code Playgroud)
]
编辑:阅读源代码后,似乎该user变量实际上并不是创建一次并永远存在。中间件和 context_processoruser为每个请求添加一个变量,并且这个“用户”实际上是从会话中提取的。
我最初的设计是:一旦选择了一个病人,接下来的所有页面都是关于这个病人的。因此,我想让该患者的 ID 始终可用。我不想到处传递这个 ID,而是想将其保存(某处)一次并始终可用,直到选择另一个患者为止。
然而现在,考虑到变量的复杂性user,我可能会放弃这种花哨的方式。只需将此 id 作为参数放在每个请求 url 中应该会更容易。
Django 使用中间件\xc2\xa0 [Django-doc]来做到这一点。事实上,设置.user属性也是通过中间件完成的。事实上,您可以在AuthenticationMiddleware\xc2\xa0 [GitHub]中看到这一点:
\nRun Code Online (Sandbox Code Playgroud)class AuthenticationMiddleware(MiddlewareMixin):\n def process_request(self, request):\n assert hasattr(request, \'session\'), (\n "The Django authentication middleware requires session middleware "\n "to be installed. Edit your MIDDLEWARE%s setting to insert "\n "\'django.contrib.sessions.middleware.SessionMiddleware\' before "\n "\'django.contrib.auth.middleware.AuthenticationMiddleware\'."\n ) % ("_CLASSES" if settings.MIDDLEWARE is None else "")\n request.user = SimpleLazyObject(lambda: get_user(request))
\'django.contrib.auth.middleware.AuthenticationMiddleware\'如果从MIDDLEWARE设置\xc2\xa0 [Django-doc]中删除字符串,则request.user不再设置。
因此,您可以实现自己的中间件。例如:
\n# app/middleware.py\n\nfrom django.utils.deprecation import MiddlewareMixin\n\nclass PatientSelectIdMiddleware(MiddlewareMixin):\n \n def process_request(self, request):\n if not hasattr(request, \'patient_selected_id\'):\n request.patient_selected_id = 0Run Code Online (Sandbox Code Playgroud)\n接下来,您需要将\'app.PatientSelectIdMiddleware\'中间件添加到MIDDLEWARE设置中。
| 归档时间: |
|
| 查看次数: |
2802 次 |
| 最近记录: |