Генерация / сокрытие сообщений от промежуточного ПО в django - PullRequest
1 голос
/ 06 марта 2019

У меня есть приложение 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

Это прекрасно работает - отображается сообщение, позволяющее всем узнать, что у пользователя возникли проблемы с регистрацией.

Однако - когда пользователь входит, чтобы отредактировать свою регистрацию и переходит на неполный курс, и сохраняет его - при сохранении он перенаправляет его на следующую страницу.

На следующей странице отображается сообщение об успешном завершении, но также отображается сообщение об ошибке. Если пользователь обновляется или переходит на любую другую страницу сайта, сообщение об ошибке исчезает.

Это связано с тем, что промежуточное ПО обрабатывает до , а представление обрабатывается - и в то время ошибка все еще имеет значение.

Как лучше всего это исправить и не показывать?

Я полагал, что в промежуточном программном обеспечении после обработки представления (которое, как я полагаю, будет включать обработку данных 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 Ответ

1 голос
/ 06 марта 2019

Поскольку вы, кажется, продолжаете выполнять эту проверку при каждом запросе, и, насколько я понимаю, «проблемные» сообщения продолжают мешать другим (например, сообщение «успех»), и их трудно отличить друг от друга, я бы рекомендовал, вероятно, не использовать рамки сообщений для этого, вы могли бы, например. просто создайте простой контекстный процессор , который предоставляет данные для полной регистрации в каждом шаблоне по каждому запросу. Таким образом, эти сообщения не будут сохраняться в сеансе, а будут заново генерироваться при каждом запросе.

Что-то вроде:

# 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...