Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中生成/隐藏来自中间件的消息_Python_Django_Django Forms_Middleware_Django Middleware - Fatal编程技术网

Python 在django中生成/隐藏来自中间件的消息

Python 在django中生成/隐藏来自中间件的消息,python,django,django-forms,middleware,django-middleware,Python,Django,Django Forms,Middleware,Django Middleware,我有一个django应用程序,它有一些中间件(以新样式编写),可以检查用户可以注册的内容是否在用户完成注册过程之前已“满” 如果它已满-中间件将启动一条错误消息,让用户知道它已满,并将他们链接到他们的注册,以便他们可以更改它 中间件如下所示: def __call__(self, request): # Code to be executed for each request before # the view (and later middleware) are called.

我有一个django应用程序,它有一些中间件(以新样式编写),可以检查用户可以注册的内容是否在用户完成注册过程之前已“满”

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

中间件如下所示:

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
我已经试过了,但是很难弄清楚如何从
FallbackStorage
对象中删除特定的消息


表单使用基于类的视图进行处理(尤其是这一视图是一个
UpdateView

因为您似乎一直在对每个请求进行检查,而且据我所知,“问题”消息一直与其他消息相互干扰(如“成功”消息)很难区分它们,我建议您不要使用messages框架,例如,您可以创建一个简单的框架,为每个请求的每个模板的完整注册提供数据。因此,这些消息不会持久化到会话中,而是在每次请求时新生成

比如:

# 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 %}

在视图中设置成功消息时,为什么不清除所有以前的消息?在这种情况下,2个或更多注册是一个问题(有些人可能注册多个类,这可能会导致满员)-我不想清除合理的顾虑。虽然,我想他们会在下一页看到错误。。。所以这可能是一个不错的临时解决办法。但如果可能的话,我希望他们看到适当的错误。另外,表格是CBV更新视图。好的,我想这会有用的。关于何时使用上下文处理器与中间件,是否有原因/逻辑?在这种情况下,它们似乎做了类似的事情。上下文处理器只是在每个请求上向每个模板上下文添加内容。使用中间件,您可以截取请求/响应并修改它们或执行其他操作,但如果您只想在每个请求上向模板获取一些数据,那么上下文处理器就足够了。当您对每个请求执行查询时,不必在会话中将消息排队(这会导致一些问题…),这非常有效。我能够平衡中间件和会话变量,以处理视图端的一些安全问题(如果用户试图在注册已满时访问视图,则重定向用户,等等),而上下文处理器是模板端错误消息的完美解决方案。谢谢
# 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 %}