在django中从中间件生成/隐藏消息

时间:2019-03-06 13:15:49

标签: python django django-forms middleware django-middleware

我有一个django应用程序,该应用程序具有一些中间件(以新样式编写),该中间件在用户完成注册过程之前检查用户可以注册的东西是否已经“满”。 / p>

如果已满-中间件会启动一条错误消息,让用户知道它已满,并将它们链接到他们的注册,以便他们可以更改它。

中间件如下:

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对象中删除该特定消息

使用基于类的视图处理表单(特别是该视图是UpdateView

1 个答案:

答案 0 :(得分:1)

由于您似乎一直对每个请求运行该检查,并且据我所知,“问题”消息会不断干扰其他人(例如“成功”消息),很难区分它们,我建议您不要使用为此的消息框架,您可以例如。只需创建一个简单的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 %}