Django 如何向请求添加属性,如';用户';变量

Django 如何向请求添加属性,如';用户';变量,django,Django,我想创建一个新变量,该变量始终可用,就像“用户”变量的工作方式一样 这是我的myapp/context\u 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(re

我想创建一个新变量,该变量始终可用,就像“用户”变量的工作方式一样

这是我的myapp/context\u 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}
问题是,它总是打印“false”。似乎我无法向请求添加属性,也无法创建一个始终可用的变量。 顺便说一句,我已经将这个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',
        ],
    },
},
]

编辑: 在阅读了源代码之后,似乎
user
变量实际上并没有被创建一次并且永远存在。中间件和上下文处理器为每个请求添加一个变量
user
,这个“用户”实际上是从会话中提取出来的

我最初的设计是:一旦选择了一名患者,接下来的所有页面都将是关于该患者的。因此,我希望该患者的id始终可用。我不想到处传递这个id,而是想将它保存(某个地方)一次,并始终可用,直到选择另一个患者

然而现在,考虑到
user
变量的复杂性,我可能会放弃这种奇特的方式。在每个请求url中简单地将此id作为参数应该更容易。

Django使用。实际上,设置
.user
属性也可以通过中间件完成。事实上,您可以在以下列表中看到这一点:


接下来,您需要将
'app.patientselectivedmddleware'
中间件添加到
中间件设置中。

您可以使用中间件执行此操作。我在
def…
行之前打印了
print(hasattr(请求,'patient\u selected\u id')
。然后我只点击了“主页”和“关于”页面[除了字符串以外的空白页面]。但是,它仍然打印
False
。是否应该有一些特殊的方法向请求添加属性?我想我可能会得到它。我在“AuthenticationMiddleware”中打印了
print(hasattr(request,user))
,它还不断打印“False”。事实上,“user”变量是从
request.session
中提取出来的,并为每个任务插入。它看起来像一个常量变量,但不是那么简单。中间件不能解决我的需要。
class AuthenticationMiddleware(MiddlewareMixin):
    def process_request(self, request):
        assert hasattr(request, 'session'), (
            "The Django authentication middleware requires session middleware "
            "to be installed. Edit your MIDDLEWARE%s setting to insert "
            "'django.contrib.sessions.middleware.SessionMiddleware' before "
            "'django.contrib.auth.middleware.AuthenticationMiddleware'."
        ) % ("_CLASSES" if settings.MIDDLEWARE is None else "")
        request.user = SimpleLazyObject(lambda: get_user(request))
# app/middleware.py

from django.utils.deprecation import MiddlewareMixin

class PatientSelectIdMiddleware(MiddlewareMixin):

    def process_request(self, request):
        if not hasattr(request, 'patient_selected_id'):
            request.patient_selected_id = 0