在 Django 中生成/隐藏来自中间件的消息
Generating / Hiding messages from middleware in django
我有一个 django 应用程序,它有一些中间件(以新样式编写),在用户完成注册过程之前检查用户可以注册的内容是否已变为 'full'为此。
如果它已满 - 中间件会启动一条错误消息,让用户知道它已满并将他们链接到他们的注册,以便他们可以更改它。
中间件如下所示:
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
# ....extra logic (working without issue)....
full_problem_registrations = Registration.objects.filter(
id__in=full_problem_registration_ids
)
request.full_problem_registrations = full_problem_registrations
request.session['registration_now_full'] = False
if full_problem_registrations:
request.session['registration_now_full'] = True
for problem_reg in full_problem_registrations:
reg_url = reverse(
"camp_registrations:edit_registration", kwargs={
'person_id': problem_reg.person.id,
'registration_id': problem_reg.id,
}
)
url_string = '<a href="%s">' % reg_url
error_message = format_html(
"The %s %s registration for %s %s at %s</a> has become\
full and is no longer available. Please either remove\
or change this registration." % (
url_string,
problem_reg.course_detail.course.camp.name,
problem_reg.person.first_name,
problem_reg.person.last_name,
problem_reg.course_detail.location.name,
)
)
existing_messages = get_messages(request)
if existing_messages:
for message in get_messages(request):
# check for duplicates
if message.message == error_message:
pass
else:
messages.error(
request,
error_message,
)
else:
messages.error(
request,
error_message,
)
else:
pass
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
效果很好 - 显示的消息让每个人都知道用户的注册有问题。
但是 - 当用户进入编辑他们的注册并更改为非完整课程并保存时 - 当他们保存它时会将他们重定向到下一页。
在下一页上它显示成功消息 - 但也继续显示错误消息。如果用户刷新或转到站点上的任何其他页面,错误消息就会消失。
这是因为中间件在处理视图之前处理视图 - 那时错误仍然存在。
解决该问题并使其不显示的最佳方法是什么?
我在处理视图后的中间件部分(我相信这将包括 POST 数据的处理)然后我们可以 运行 再次检查并删除错误,如果它存在;但我不知道如何很好地从消息中删除错误。
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
# should I be checking here to see if the problem still exists and
# removing the message here?
我试过了 - 但很难弄清楚如何从 FallbackStorage
对象中删除 特定消息。
使用基于 Class 的视图处理表单(特别是这个是 UpdateView
)
因为你似乎保持 运行 检查每个请求,据我所知 "problem" 消息不断干扰其他人(如 "success" 消息)并且很难告诉他们我会建议可能不为此使用消息框架,你可以例如。只需创建一个简单的 context processor 即可为每个请求的每个模板提供完整注册的数据。因此,这些消息不会持久保存到会话中,而是在每次请求时重新生成。
类似于:
# context processor
def registrations(request):
# .....
full_problem_registrations = Registration.objects.filter(
id__in=full_problem_registration_ids
)
return full_problem_registrations
# add a snippet to eg. your base template
{% if full_problem_registrations.exists %}
Generate problem messages here
{% endif %}
我有一个 django 应用程序,它有一些中间件(以新样式编写),在用户完成注册过程之前检查用户可以注册的内容是否已变为 'full'为此。
如果它已满 - 中间件会启动一条错误消息,让用户知道它已满并将他们链接到他们的注册,以便他们可以更改它。
中间件如下所示:
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
# ....extra logic (working without issue)....
full_problem_registrations = Registration.objects.filter(
id__in=full_problem_registration_ids
)
request.full_problem_registrations = full_problem_registrations
request.session['registration_now_full'] = False
if full_problem_registrations:
request.session['registration_now_full'] = True
for problem_reg in full_problem_registrations:
reg_url = reverse(
"camp_registrations:edit_registration", kwargs={
'person_id': problem_reg.person.id,
'registration_id': problem_reg.id,
}
)
url_string = '<a href="%s">' % reg_url
error_message = format_html(
"The %s %s registration for %s %s at %s</a> has become\
full and is no longer available. Please either remove\
or change this registration." % (
url_string,
problem_reg.course_detail.course.camp.name,
problem_reg.person.first_name,
problem_reg.person.last_name,
problem_reg.course_detail.location.name,
)
)
existing_messages = get_messages(request)
if existing_messages:
for message in get_messages(request):
# check for duplicates
if message.message == error_message:
pass
else:
messages.error(
request,
error_message,
)
else:
messages.error(
request,
error_message,
)
else:
pass
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
效果很好 - 显示的消息让每个人都知道用户的注册有问题。
但是 - 当用户进入编辑他们的注册并更改为非完整课程并保存时 - 当他们保存它时会将他们重定向到下一页。
在下一页上它显示成功消息 - 但也继续显示错误消息。如果用户刷新或转到站点上的任何其他页面,错误消息就会消失。
这是因为中间件在处理视图之前处理视图 - 那时错误仍然存在。
解决该问题并使其不显示的最佳方法是什么?
我在处理视图后的中间件部分(我相信这将包括 POST 数据的处理)然后我们可以 运行 再次检查并删除错误,如果它存在;但我不知道如何很好地从消息中删除错误。
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
# should I be checking here to see if the problem still exists and
# removing the message here?
我试过了 - 但很难弄清楚如何从 FallbackStorage
对象中删除 特定消息。
使用基于 Class 的视图处理表单(特别是这个是 UpdateView
)
因为你似乎保持 运行 检查每个请求,据我所知 "problem" 消息不断干扰其他人(如 "success" 消息)并且很难告诉他们我会建议可能不为此使用消息框架,你可以例如。只需创建一个简单的 context processor 即可为每个请求的每个模板提供完整注册的数据。因此,这些消息不会持久保存到会话中,而是在每次请求时重新生成。
类似于:
# context processor
def registrations(request):
# .....
full_problem_registrations = Registration.objects.filter(
id__in=full_problem_registration_ids
)
return full_problem_registrations
# add a snippet to eg. your base template
{% if full_problem_registrations.exists %}
Generate problem messages here
{% endif %}